次の方法で共有


クイック スタート: Python 用 pyodbc ドライバーを使用して接続する

このクイック スタートでは、サンプル データを作成して読み込んだデータベースに Python スクリプトを接続します。 Python 用の pyodbc ドライバーを使用してデータベースに接続し、データの読み取りと書き込みなどの基本的な操作を実行します。

pyodbc のドキュメント | pyodbc ソース コード | パッケージ (PyPi)

[前提条件]

  • Python 3

    • Pythonをまだお持ちでない場合は、Python ランタイムPython パッケージ インデックス (PyPI) パッケージ マネージャーpython.org からインストールします。

    • 自身の環境以外を使用しますか? GitHub Codespacesを使用して devcontainer として開きます。

  • PyPI からの pyodbc パッケージ。

  • AdventureWorks2022サンプル スキーマと有効な接続文字列を含む、Fabric の SQL Server、Azure SQL Database、または SQL データベース上のデータベース。

セットアップ中

次の手順に従って、 pyodbc Python ドライバーを使用してアプリケーションを開発するように開発環境を構成します。

このドライバーでは 、TDS プロトコルが使用されます。このプロトコルは、SQL Server、Fabric の SQL データベース、Azure SQL Database で既定で有効になっています。 追加の構成は不要です。

pyodbc パッケージをインストールする

PyPI からpyodbc パッケージを取得します。

  1. 空のファイル ディレクトリでコマンド プロンプトを開きます。

  2. pyodbc パッケージをインストールします。

    pip install pyodbc
    

インストールしたパッケージを確認する

PyPI コマンド ライン ツールを使用して、目的のパッケージがインストールされていることを確認できます。

  1. pip list でインストールされているパッケージの一覧を確認します。

    pip list
    

SQL Database の作成

このクイック スタートでは、Microsoft SQL Server の AdventureWorks2022 Lightweight スキーマ、Fabric の SQL データベース、または Azure SQL Database が必要です。

コードを実行する

[新しいファイルの作成]

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

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

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

    from os import getenv
    from dotenv import load_dotenv
    from pyodbc import connect
    
  4. pyodbc.connect 関数を使用して SQL データベースに接続します。

    load_dotenv()
    conn = connect(getenv("SQL_CONNECTION_STRING"))
    
  5. 現在のディレクトリに、 *.envという名前の新しいファイルを作成します。

  6. *.env ファイル内に、SQL_CONNECTION_STRINGという名前の接続文字列のエントリを追加します。 ここでの例を実際の接続文字列の値に置き換えます。

    SQL_CONNECTION_STRING="Driver={ODBC Driver 18 for SQL Server};Server=<server_name>;Database={<database_name>};Encrypt=yes;TrustServerCertificate=no;Authentication=ActiveDirectoryInteractive"
    

    ヒント

    ここで使用される接続文字列は、接続先の SQL データベースの種類によって大きく異なります。 接続文字列とその構文の詳細については、 接続文字列の構文リファレンスを参照してください。

クエリを実行する

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. randrange ライブラリからrandomの上部にapp.pyのインポートを追加します。

    from random import randrange
    
  2. app.pyの最後に、ランダムな製品番号を生成するコードを追加します。

    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
    

次のステップ

その他の例については、 pyodbc ドライバーの GitHub リポジトリを参照して、アイデアの投稿や問題の報告を行います。