このクイック スタートでは、サンプル データを作成して読み込んだデータベースに Python スクリプトを接続します。 Python 用の pyodbc
ドライバーを使用してデータベースに接続し、データの読み取りと書き込みなどの基本的な操作を実行します。
pyodbc のドキュメント | pyodbc ソース コード | パッケージ (PyPi)
[前提条件]
Python 3
Pythonをまだお持ちでない場合は、Python ランタイムと Python パッケージ インデックス (PyPI) パッケージ マネージャーを python.org からインストールします。
自身の環境以外を使用しますか? GitHub Codespacesを使用して devcontainer として開きます。
PyPI からの
pyodbc
パッケージ。AdventureWorks2022
サンプル スキーマと有効な接続文字列を含む、Fabric の SQL Server、Azure SQL Database、または SQL データベース上のデータベース。
セットアップ中
次の手順に従って、 pyodbc
Python ドライバーを使用してアプリケーションを開発するように開発環境を構成します。
注
このドライバーでは 、TDS プロトコルが使用されます。このプロトコルは、SQL Server、Fabric の SQL データベース、Azure SQL Database で既定で有効になっています。 追加の構成は不要です。
pyodbc パッケージをインストールする
PyPI からpyodbc
パッケージを取得します。
空のファイル ディレクトリでコマンド プロンプトを開きます。
pyodbc
パッケージをインストールします。pip install pyodbc
インストールしたパッケージを確認する
PyPI コマンド ライン ツールを使用して、目的のパッケージがインストールされていることを確認できます。
pip list
でインストールされているパッケージの一覧を確認します。pip list
SQL Database の作成
このクイック スタートでは、Microsoft SQL Server の AdventureWorks2022 Lightweight スキーマ、Fabric の SQL データベース、または Azure SQL Database が必要です。
コードを実行する
[新しいファイルの作成]
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 データベースの種類によって大きく異なります。 接続文字列とその構文の詳細については、 接続文字列の構文リファレンスを参照してください。
クエリを実行する
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 リポジトリを参照して、アイデアの投稿や問題の報告を行います。