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

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

mssql-python ドライバーでは、Windows マシンへの外部依存関係は必要ありません。 ドライバーは、1 つの pip インストールで必要なすべてのものをインストールします。これにより、アップグレードとテストの時間がない他のスクリプトを中断することなく、新しいスクリプトに最新バージョンのドライバーを使用できます。

この記事のローカルSQL認証例は、あなたが管理するSQL Serverインスタンスに対するローカル開発にのみ使用してください。 Azure SQL Database、FabricのSQLデータベース、共有開発環境、CI、本番環境の導入では、まずMicrosoft Entra認証や他のパスワードレスフローから始めましょう。

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

[前提条件]

SQL Server、Azure SQL Database、またはFabricのSQLデータベース上でデータベースを作成または接続できます。 以下の手順でAdventureWorks2025サンプルスキーマを用いてデータベースを作成し、接続文字列は後で保管してください。

SQL データベースを作成する

以下のいずれかのプラットフォームでSQLデータベースを作成または接続してください:

設定

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

このドライバーは Tabular Data Stream(TDS) プロトコルを使用しています。 SQL Server、FabricのSQL Database、Azure SQL DatabaseはデフォルトでTDSを有効にするため、追加の設定は不要です。

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

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

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

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

    pip install mssql-python
    

python-dotenv パッケージをインストールしてください

PyPIから python-dotenv パッケージを入手してください。

  1. 同じディレクトリに、 python-dotenv パッケージをインストールします。

    pip install python-dotenv
    

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

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

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

    pip list
    

コードを実行する

新しいファイルを作成する

  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という名前の接続文字列のエントリを追加します。 以下の例のいずれかを使い、プレースホルダーを実際の値に置き換えてください。

    Azure SQL DatabaseまたはFabricのSQLデータベースの場合は、まずMicrosoft Entra認証から始めてください:

    SQL_CONNECTION_STRING="Server=<server_name>;Database=<database_name>;Encrypt=yes;TrustServerCertificate=no;Authentication=ActiveDirectoryInteractive"
    

    開発中のローカルSQL Serverでは、まずSQL認証から始めてください:

    SQL_CONNECTION_STRING="Server=localhost,1433;Database=<database_name>;UID=<username>;PWD=<password>;Encrypt=yes;TrustServerCertificate=yes"
    

    Caution

    .env展開の手段ではなく、地域の開発の利便性として扱いましょう。 絶対にコミットせず、共有環境や本番環境でSQL認証サンプルを再利用せず、証明書検証はローカル開発以外で有効にしておきましょう。

    Connection文字列を使って、サンプルを名前付きインスタンス、コンテナ、または高度な設定に適応させてください。 Azure SQL DatabaseやFabricのSQLデータベースに接続する場合は、パスワード不要かつインタラクティブなサインインオプションのためにMicrosoft Entra認証を使いましょう。 より広範なシークレットおよび証明書のガイダンスについては、 セキュリティのベストプラクティスを参照してください。

クエリを実行する

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.fetchallfor ループと共に使用します。 それから記録を印刷してください。

    records = cursor.fetchall()
    for r in records:
      print(f"{r.CustomerID}\t{r.OrderCount}\t{r.CompanyName}")
    
  4. ファイルをapp.py

    ヒント

    macOS では、 ActiveDirectoryInteractiveActiveDirectoryDefault の両方が Microsoft Entra 認証で機能します。 ActiveDirectoryInteractive スクリプトを実行するたびにサインインするように求められます。 繰り返しサインインのプロンプトを避けるために、を実行してaz loginから一度サインインし、その後キャッシュされた認証情報を再利用するActiveDirectoryDefaultを使いましょう。

  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 (%(name)s, %(product_number)s, %(standard_cost)s, %(list_price)s, CURRENT_TIMESTAMP)
    """
    
  4. cursor.execute を使用してステートメントを実行します。

    cursor.execute(
       SQL_STATEMENT,
       {
          'name': f'Example Product {productNumber}',
          'product_number': f'EXAMPLE-{productNumber}',
          'standard_cost': 100,
          'list_price': 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
    

次のステップ

これらの記事を使って、さらに成長を続けましょう: