手順 3:pyodbcを使用した SQL への接続を概念実証する

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

Note

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

前提条件

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

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

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

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

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

    import pyodbc
    
  4. 接続資格情報の変数を作成します。

    SERVER = '<server-address>'
    DATABASE = '<database-name>'
    USERNAME = '<username>'
    PASSWORD = '<password>'
    
  5. 文字列補間を使用して接続文字列変数を作成します。

    connectionString = f'DRIVER={{ODBC Driver 18 for SQL Server}};SERVER={SERVER};DATABASE={DATABASE};UID={USERNAME};PWD={PASSWORD}'
    
  6. pyodbc.connect 関数を使用して SQL Database に接続します。

    conn = pyodbc.connect(connectionString) 
    

クエリを実行する

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)
    

    Note

    この関数は基本的に任意のクエリを受け取り、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 (?, ?, ?, ?, CURRENT_TIMESTAMP)
    """
    
  4. cursor.executeを使用してステートメントを実行します。

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

    resultId = cursor.fetchval()
    print(f"Inserted Product ID : {resultId}")
    conn.commit()
    

    ヒント

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

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

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

    python app.py
    
    Inserted Product ID : 1001
    

次のステップ