ステップ 3: pymssql を使用した SQL への接続を概念実証する

この概念実証のサンプルは、SQL Database への接続に pymssql を使用します。 このサンプルでは、AdventureWorksLT サンプル データベースを使用していることを前提としています。

注意

この例は概念実証としてのみ検討してください。 わかりやすさのためにサンプル コードは簡略化されており、Microsoft が推奨するベスト プラクティスを表しているとは限りません。

前提条件

  • Python 3
    • Python をまだお持ちでない場合は、Python ランタイムPython パッケージ インデックス (PyPI) パッケージ マネージャーpython.org からインストールします。
    • 自身の環境以外を使用しますか? GitHub Codespaces を使用して devcontainer として開きます。
      • Open in GitHub Codespaces
  • PyPI からの pymssql パッケージ。
  • SQL Database と資格情報。

データに接続してクエリを実行する

資格情報を使用してデータベースに接続します。

  1. app.py という名前で新しいファイルを作成します。

  2. モジュール docstring を追加します。

    """
    Connects to a SQL database using pymssql
    """
    
  3. pymssql パッケージをインポートします。

    import pymssql
    
  4. pymssql.connect 関数を使用して SQL Database に接続します。

    conn = pymssql.connect(
        server='<server-address>',
        user='<username>',
        password='<password>',
        database='<database-name>',
        as_dict=True
    )  
    

クエリを実行する

SQL クエリ文字列を使用してクエリを実行し、結果を解析します。

  1. SQL クエリ文字列の新しい変数を作成します。

    SQL_QUERY = """
    SELECT 
    TOP 5 c.CustomerID, 
    c.CompanyName, 
    COUNT(soh.SalesOrderID) AS OrderCount 
    FROM 
    SalesLT.Customer AS c 
    LEFT OUTER JOIN SalesLT.SalesOrderHeader AS soh ON c.CustomerID = soh.CustomerID 
    GROUP BY 
    c.CustomerID, 
    c.CompanyName 
    ORDER BY 
    OrderCount DESC;
    """
    
  2. cursor.execute を使用してデータベースに対するクエリから結果セットを取得します。

    cursor = conn.cursor()
    cursor.execute(SQL_QUERY)
    

    注意

    この関数は基本的に任意のクエリを受け取り、cursor.fetchone() を使用して反復処理できる結果セットを返します。

  3. cursor.fetchallforeach ループとともに使用して、データベースからすべてのレコードを取得します。 次に、レコードを出力します。

    records = cursor.fetchall()
    for r in records:
        print(f"{r['CustomerID']}\t{r['OrderCount']}\t{r['CompanyName']}")
    
  4. app.py ファイルを保存します。

  5. ターミナルを開き、アプリケーションをテストします。

    python app.py
    
    29485   1       Professional Sales and Service
    29531   1       Remarkable Bike Store
    29546   1       Bulk Discount Store
    29568   1       Coalition Bike Company
    29584   1       Futuristic Bikes
    

トランザクションとして行を挿入する

この例では、INSERT ステートメントを安全に実行し、パラメーターを渡す方法について説明します。 パラメーターを値として渡すと、アプリケーションは SQL インジェクションから保護されます。

  1. randrangerandom ライブラリからインポートします。

    from random import randrange
    
  2. ランダムな製品番号を生成します。

    productNumber = randrange(1000)
    

    ヒント

    ここでランダムな製品番号を生成することで、このサンプルを複数回実行できるようになります。

  3. SQL ステートメント文字列を作成します。

    SQL_STATEMENT = """
    INSERT SalesLT.Product (
    Name, 
    ProductNumber, 
    StandardCost, 
    ListPrice, 
    SellStartDate
    ) OUTPUT INSERTED.ProductID 
    VALUES (%s, %s, %s, %s, CURRENT_TIMESTAMP)
    """
    
  4. cursor.execute を使用してステートメントを実行します。

    cursor.execute(
        SQL_STATEMENT,
        (
            f'Example Product {productNumber}', 
            f'EXAMPLE-{productNumber}', 
            100,
            200
        )
    )
    
  5. cursor.fetchone を使用して単一の結果を フェッチし、結果の一意識別子を出力した後、connection.commit を使用して操作をトランザクションとしてコミットします。

    result = cursor.fetchone()
    print(f"Inserted Product ID : {result['ProductID']}")
    conn.commit()
    

    ヒント

    必要に応じて、connection.rollback を使用してトランザクションをロールバックできます。

  6. cursor.closeconnection.close を使用してカーソルと接続を閉じます。

    cursor.close()
    conn.close()
    
  7. app.py ファイルを保存し、アプリケーションをもう一度テストする

    python app.py
    
    Inserted Product ID : 1001
    

次のステップ