このクイック スタートでは、サンプル データを作成して読み込んだデータベースに 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、ファブリックの SQL データベース、Azure SQL Database で既定で有効になっています。 別途の構成は必要ありません。
pyodbc パッケージをインストールする
PyPI から pyodbc
パッケージを取得します。
空のディレクトリでコマンド プロンプトを開きます。
pyodbc
パッケージをインストールします。pip install pyodbc
python-dotenv パッケージをインストールする
PyPI から python-dotenv
を取得します。
同じディレクトリに、
python-dotenv
パッケージをインストールします。pip install python-dotenv
インストールしたパッケージを確認する
PyPI コマンド ライン ツールを使用して、目的のパッケージがインストールされていることを確認できます。
pip list
で、インストールされているパッケージの一覧を確認します。pip list
SQL データベースを作成する
このクイック スタートでは、Microsoft SQL Server の AdventureWorks2022 Lightweight スキーマ、Fabric の SQL データベース、または Azure SQL Database が必要です。
Azure ポータルを使用して数分で SQL データベースを作成する
[接続文字列] タブからODBC
接続文字列をコピーします。
コードを実行する
新しいファイルを作成する
app.py
という名前で新しいファイルを作成します。モジュール docstring を追加します。
""" Connects to a SQL database using pyodbc """
pyodbc
パッケージをインポートします。from os import getenv from dotenv import load_dotenv from pyodbc import connect
pyodbc.connect
関数を使用して SQL データベースに接続します。load_dotenv() conn = connect(getenv("SQL_CONNECTION_STRING"))
現在のディレクトリに、
.env
という名前の新しいファイルを作成します。.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 データベースの種類によって大きく異なります。 Fabric で Azure SQL Database または SQL データベースに接続する場合は、[接続文字列] タブから ODBC 接続文字列を使用します。シナリオによっては、認証の種類の調整が必要になる場合があります。 接続文字列とその構文の詳細については、 接続文字列の構文リファレンスを参照してください。
クエリを実行する
SQL クエリ文字列を使用してクエリを実行し、結果を解析します。
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; """
cursor.execute
を使用して、データベースに対するクエリから結果セットを取得します。cursor = conn.cursor() cursor.execute(SQL_QUERY)
注
この関数は基本的に任意のクエリを受け取り、cursor.fetchone() を使用して反復処理できる結果セットを返します。
データベースからすべてのレコードを取得するには、
cursor.fetchall
をforeach
ループと共に使用します。 次に、レコードを出力します。records = cursor.fetchall() for r in records: print(f"{r.CustomerID}\t{r.OrderCount}\t{r.CompanyName}")
ファイルを
app.py
。ターミナルを開き、アプリケーションをテストします。
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 インジェクション 攻撃からアプリケーションが保護されます。
randrange
ライブラリからrandom
の上部にapp.py
のインポートを追加します。from random import randrange
app.py
の最後に、ランダムな製品番号を生成するコードを追加します。productNumber = randrange(1000)
ヒント
ここでランダムな製品番号を生成すると、このサンプルを複数回実行できるようになります。
SQL ステートメント文字列を作成します。
SQL_STATEMENT = """ INSERT SalesLT.Product ( Name, ProductNumber, StandardCost, ListPrice, SellStartDate ) OUTPUT INSERTED.ProductID VALUES (?, ?, ?, ?, CURRENT_TIMESTAMP) """
cursor.execute
を使用してステートメントを実行します。cursor.execute( SQL_STATEMENT, ( f'Example Product {productNumber}', f'EXAMPLE-{productNumber}', 100, 200 ) )
cursor.fetchval
を使用して単一の結果の最初の列を取得し、結果の一意の識別子を出力してから、connection.commit
を使用してトランザクションとして操作をコミットします。resultId = cursor.fetchval() print(f"Inserted Product ID : {resultId}") conn.commit()
ヒント
必要に応じて、
connection.rollback
を使用してトランザクションをロールバックできます。cursor.close
とconnection.close
を使用してカーソルと接続を閉じます。cursor.close() conn.close()
ファイルを
app.py
し、アプリケーションをもう一度テストします。python app.py
予想される出力を次に示します。
Inserted Product ID : 1001
次のステップ
その他の例については、 pyodbc
ドライバーの GitHub リポジトリを参照して、アイデアの投稿や問題の報告を行います。