次の方法で共有


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

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

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

[前提条件]

  • Python 3

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

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

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

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

セットアップ中

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

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

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

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

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

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

    pip install pymssql
    

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

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 pymssql
    """
    
  3. pymssqlを含むパッケージをインポートします。

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

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

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

    SQL_SERVER="<server_name>"
    SQL_USER="<sql_user_name>"
    SQL_PASSWORD="<sql_user_password>"
    SQL_DATABASE="<sql_database>"
    

    ヒント

    ここで使用される接続文字列は、接続先の 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(as_dict=True)
    cursor.execute(SQL_QUERY)
    

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

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

    for r in cursor:
        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 (%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
    

次のステップ

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