手順 3:pyodbc を使用した SQL への接続を概念実証する

この例は、概念実証です。 わかりやすさのためにサンプル コードは簡略化されており、Microsoft が推奨するベスト プラクティスを表しているとは限りません。

開始するには、次のサンプル スクリプトを実行します。 test.py という名前のファイルを作成し、各コード スニペットを追加していきます。

> python test.py

接続する

import pyodbc 
# Some other example server values are
# server = 'localhost\sqlexpress' # for a named instance
# server = 'myserver,port' # to specify an alternate port
server = 'tcp:myserver.database.windows.net' 
database = 'mydb' 
username = 'myusername' 
password = 'mypassword' 
# ENCRYPT defaults to yes starting in ODBC Driver 18. It's good to always specify ENCRYPT=yes on the client side to avoid MITM attacks.
cnxn = pyodbc.connect('DRIVER={ODBC Driver 18 for SQL Server};SERVER='+server+';DATABASE='+database+';ENCRYPT=yes;UID='+username+';PWD='+ password)
cursor = cnxn.cursor()

Run query

Cursor.execute 関数は、SQL Database に対するクエリから結果セットを取得するために使用できます。 この関数はクエリを受け取り、cursor.fetchone() を使用して反復処理できる結果セットを返します。

#Sample select query
cursor.execute("SELECT @@version;") 
row = cursor.fetchone() 
while row: 
    print(row[0])
    row = cursor.fetchone()

行を挿入する

この例からは、INSERT ステートメントを安全に実行し、パラメーターを渡す方法がわかります。 パラメーターにより、アプリケーションは SQL インジェクションから保護されます。

#Sample insert query
count = cursor.execute("""
INSERT INTO SalesLT.Product (Name, ProductNumber, StandardCost, ListPrice, SellStartDate) 
VALUES (?,?,?,?,?)""",
'SQL Server Express New 20', 'SQLEXPRESS New 20', 0, 0, CURRENT_TIMESTAMP).rowcount
cnxn.commit()
print('Rows inserted: ' + str(count))

Azure Active Directory と接続文字列

pyODBC では、Microsoft ODBC Driver for SQL Server が使用されます。 ODBC ドライバーのバージョンが 17.1 以降の場合は、pyODBC を通じて Azure Active Directory 対話型モードの ODBC ドライバーを使用できます。

この対話型オプションは、Python と pyODBC によって ODBC ドライバーでのダイアログの表示が許可されている場合に機能します。 このオプションは、Windows オペレーティング システムでのみ使用できます。

Azure Active Directory 対話型認証の接続文字列の例

次の例は、Azure Active Directory 対話型認証を指定する ODBC 接続文字列を提供します。

server=Server;database=Database;UID=UserName;Authentication=ActiveDirectoryInteractive;Encrypt=yes;

ODBC ドライバーの認証オプションの詳細については、「ODBC ドライバーでの Azure Active Directory の使用」を参照してください。

次のステップ

詳細については、 Python デベロッパー センターを参照してください。