次の方法で共有


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

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

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

[前提条件]

  • Python 3

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

    • 独自環境を使用しない場合: GitHub Codespaces を使用して devcontainer として開きます。

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

  • AdventureWorks2022 サンプル スキーマと有効な接続文字列を含む、SQL Server 上のデータベース、Azure SQL Database、または Fabric 上の 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 データベースを作成する

このクイック スタートでは、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 リポジトリを参照して、アイデアの投稿や問題の報告を行います。