次の方法で共有


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

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

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

[前提条件]

  • Python 3

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

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

  • PyPI からの mssql-python パッケージ。

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

セットアップ中

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

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

mssql-python パッケージをインストールする

PyPI からmssql-python パッケージを取得します。

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

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

    pip install mssql-python
    

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

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

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

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

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

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

    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.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
    

次のステップ

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