クイック スタート: Python 用 mssql-python ドライバーを使用した反復可能なデプロイ

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

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

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

[前提条件]

オペレーティング システム固有の 1 回限りの前提条件をインストールします。 Windowsユーザーはこのステップをスキップできます。 プラットフォームの詳細は 「Install mssql-python」をご覧ください。

apk add libtool krb5-libs krb5-dev

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

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

プロジェクトを作成してコードを実行する

新しいプロジェクトを作成する

  1. 開発ディレクトリでコマンド プロンプトを開きます。 もし持っていなければ、 pythonscriptsなどの新しいディレクトリを作成しましょう。 OneDriveのフォルダは避けてください。同期が仮想環境の管理に支障をきたす可能性があります。

  2. を使用して新しいuvを作成します。

    uv init mssql-python-repeatable-qs
    cd mssql-python-repeatable-qs
    

依存関係の追加

同じディレクトリに、 mssql-pythonpython-dotenv、および rich パッケージをインストールします。

uv add mssql-python python-dotenv rich

Visual Studio Code を起動します

同じディレクトリで、次のコマンドを実行します。

code .

pyproject.toml を更新する

  1. pyproject.toml には、プロジェクトのメタデータが含まれています。 お気に入りのエディターでファイルを開きます。

  2. ファイルの内容を確認します。 この例のようになります。 最小バージョンを定義するためのPythonバージョンと依存関係mssql-python>=に注目してください。 正確なバージョンを使用する場合は、バージョン番号の前の >===に変更します。 各パッケージの解決されたバージョンは uv.lockに保存されます。 ロックファイルにより、プロジェクトに携わる開発者が一貫したパッケージバージョンを使用することが保証されます。 また、エンド ユーザーにパッケージを配布するときに、まったく同じパッケージ バージョンのセットが使用されるようになります。 pyproject.tomluv.lockの両方をコミットし、プルリクエストでロックファイルの変更を確認し、CIで組織承認の依存スキャナーを実行します。 uv.lockファイルを直接編集しないでください。

    [project]
    name = "mssql-python-repeatable-qs"
    version = "0.1.0"
    description = "Add your description here"
    readme = "README.md"
    requires-python = ">=3.11"
    dependencies = [
        "mssql-python>=0.10.0",
        "python-dotenv>=1.1.1",
        "rich>=14.1.0",
    ]
    
  3. 説明をよりわかりやすいものに更新します。

    description = "Connects to a SQL database using mssql-python"
    
  4. ファイルを保存して閉じます。

main.py の更新

  1. main.pyという名前のファイルを開きます。 この例のようになります。

    def main():
        print("Hello from mssql-python-repeatable-qs!")
    
    if __name__ == "__main__":
        main()
    
  2. ファイルの一番上で、 def main()の行の前に以下のインポートを追加してください。

    ヒント

    Visual Studio Code でパッケージの解決に問題がある場合は、 インタープリターを更新して仮想環境を使用する必要があります。

    from os import getenv
    from dotenv import load_dotenv
    from mssql_python import connect, Connection, Cursor
    from rich.console import Console
    from rich.progress import Progress, SpinnerColumn, TextColumn
    from rich.table import Table
    from argparse import ArgumentParser
    from time import sleep
    
  3. インポートと def main()行の間に、次のコードを追加します。

    def get_results(sleep_time: int = 0) -> None:
     with Progress(
         SpinnerColumn(),
         TextColumn("[progress.description]{task.description}"),
         transient=True,
     ) as progress:
         task = progress.add_task(
             description="Connecting to SQL...")
    
         cursor = query_sql()
    
         # Simulate a slow connection for demo purposes
         sleep(sleep_time)
    
         progress.update(task, description="Formatting results...")
    
         table = Table(title="Orders by Customer")
         # https://rich.readthedocs.io/en/stable/appendix/colors.html
         table.add_column("Customer ID", style="bright_blue", justify="center")
         table.add_column("Company Name", style="bright_white", justify="left")
         table.add_column("Order Count", style="bold green", justify="right")
    
         records = cursor.fetchall()
         for r in records:
             table.add_row(f"{r.CustomerID}",
                           f"{r.CompanyName}", f"{r.OrderCount}")
    
         if cursor:
             cursor.close()
    
         # Simulate a slow connection for demo purposes
         sleep(sleep_time)
    
         progress.stop()
    
         Console().print(table)
    
  4. インポートと def get_results(sleep_time: int = 0) -> None:の間に、このコードを追加します。

    _connection = None
    
    def get_connection() -> Connection:
       global _connection
       if not _connection:
           load_dotenv()
           _connection = connect(getenv("SQL_CONNECTION_STRING"))  # type: ignore
       return _connection
    
    def query_sql() -> Cursor:
    
       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;
       """
    
       conn = get_connection()
       cursor = conn.cursor()
       cursor.execute(SQL_QUERY)
       return cursor
    
  5. このコードを見つけなさい。

    def main():
        print("Hello from mssql-python-repeatable-qs!")
    
  6. これをこのコードに置き換えます。

    def main() -> None:
       parser = ArgumentParser()
       parser.add_argument("--sleep-time", type=int, default=0,
                           help="Time to sleep in seconds to simulate slow connection")
       args = parser.parse_args()
    
       if args.sleep_time > 0:
           get_results(args.sleep_time)
       else:
           get_results()
    
       if _connection:
           _connection.close()
    
  7. main.pyを保存して閉じます。

接続文字列を保存する

  1. .gitignore ファイルを開き、.env ファイルの除外を追加します。 ファイルは次の例のようになります。 完了したら、必ず保存して閉じてください。

    # Python-generated files
    __pycache__/
    *.py[oc]
    build/
    dist/
    wheels/
    *.egg-info
    
    # Virtual environments
    .venv
    
    # Connection strings and secrets
    .env
    
  2. 現在のディレクトリに、 .envという名前の新しいファイルを作成します。

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

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

    Important

    .env はローカルに保持し、ソース管理の対象外にしてください。 CIやデプロイされた環境では、接続文字列やそのコンポーネントの秘密をプラットフォームの秘密ストアから注入し、マシン間で.envをコピーするのを防ぎましょう。

    ヒント

    ここで使用される接続文字列は、接続先の SQL データベースの種類によって大きく異なります。 Fabric で Azure SQL Database または SQL データベースに接続する場合は、[接続文字列] タブから ODBC 接続文字列を使用します。シナリオによっては、認証の種類の調整が必要になる場合があります。 接続文字列とその構文の詳細については、 接続文字列の構文リファレンスを参照してください。

uv run を使用してスクリプトを実行する

ヒント

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

  1. 以前のターミナル ウィンドウで、または同じディレクトリに対して新しいターミナル ウィンドウを開き、次のコマンドを実行します。

     uv run main.py
    
  2. 次に、もう一度実行しますが、両方の状態の更新を確認できるように、よりゆっくりとしましょう。

     uv run main.py --sleep-time 5
    

    スクリプトが完了したときに予想される出力を次に示します。

                             Orders by Customer
    ┏━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━┓
    ┃ Customer ID ┃ Company Name                   ┃ Order Count ┃
    ┡━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━┩
    │    29485    │ Professional Sales and Service │           1 │
    │    29531    │ Remarkable Bike Store          │           1 │
    │    29546    │ Bulk Discount Store            │           1 │
    │    29568    │ Coalition Bike Company         │           1 │
    │    29584    │ Futuristic Bikes               │           1 │
    └─────────────┴────────────────────────────────┴─────────────┘
    
  3. スクリプトを別のマシンにデプロイするには、プロジェクトファイル( pyproject.tomluv.lockを含む)だけはコピーしてください。ただし、 .venv フォルダやローカル .env ファイルはコピーしないでください。 初回実行時に仮想環境を再構築し、ターゲット環境を通じて秘密情報を提供します。

次のステップ

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

  • 異なるSQLデータベースタイプや認証方法に対応する接続文字列を構築します。
  • クエリパターン、パラメータ付きクエリ、結果処理について学ぶためのクエリ実行
  • コンテキストマネージャー、プーリング、接続設定を使った接続管理