手順 3:pyodbcを使用した SQL への接続を概念実証する
この概念実証のサンプルでは、SQL データベースへの接続に使用 pyodbc
します。 このサンプルでは、AdventureWorksLT サンプル データベースを使用していることを前提としています。
Note
この例は概念実証としてのみ検討してください。 わかりやすさのためにサンプル コードは簡略化されており、Microsoft が推奨するベスト プラクティスを表しているとは限りません。
前提条件
- Python 3
- Pythonをまだお持ちでない場合は、Python ランタイムと Python パッケージ インデックス (PyPI) パッケージ マネージャーを python.org からインストールします。
- 自身の環境以外を使用しますか? GitHub Codespacesを使用して devcontainer として開きます。
- PyPI からの
pyodbc
パッケージ。 - SQL Server 用 Microsoft ODBC ドライバー 18 をインストールする
- SQL データベースと資格情報。
データに接続してクエリを実行する
資格情報を使用してデータベースに接続します。
app.py という名前で新しいファイルを作成します。
モジュール docstringを追加します。
""" Connects to a SQL database using pyodbc """
pyodbc
パッケージをインポートします。import pyodbc
接続資格情報の変数を作成します。
SERVER = '<server-address>' DATABASE = '<database-name>' USERNAME = '<username>' PASSWORD = '<password>'
文字列補間を使用して接続文字列変数を作成します。
connectionString = f'DRIVER={{ODBC Driver 18 for SQL Server}};SERVER={SERVER};DATABASE={DATABASE};UID={USERNAME};PWD={PASSWORD}'
関数を
pyodbc.connect
使用して SQL データベースに接続します。conn = pyodbc.connect(connectionString)
クエリを実行する
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)
Note
この関数は基本的に任意のクエリを受け取り、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
ライブラリからインポートします。from random import randrange
ランダムな製品番号を生成します。
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