自己投資としてチャレンジしている内容を Blog で公開しています。
今回は pyodbc を使って python で SQL Server に接続し、クエリのコミット、ロールバックを行う、トランザクションの実装方法を紹介します。
Summary
▼1. SQL Server on Ubuntu トランザクションでクエリを制御する方法
本 blog で以前 Java によるトランザクションを利用したクエリを紹介しました。今回は python で pyodbc を使います。Pyodbc では既定で autocommit が true になり、自動でトランザクションの commit が行われています。
▼2. autocommit を False にし insert を実行する Python
以下の例ではテーブル sampletb の c1, c2 列に (10,10) の 行をトランザクションを開始後 insert し、実行結果を確認するための select を実行しています。この例では commit せずに insert を完了しています。
2-1. Python コードの作成
pyodbc.connect で autocommit を False にし、insert 後、commit せずクエリを完了します。
import pyodbc
import time
import datetime
server = 'localhost'
database = 'testdb'
username = 'sa'
password = 'yourpassword'
driver= '{ODBC Driver 17 for SQL Server}'
success = False
retryc = 0
max_retries = 3
while not success and retryc < max_retries:
try:
cnxn = pyodbc.connect('DRIVER='+driver+';SERVER='+server+',1433;DATABASE='+database+';UID='+username+';PWD='+ password+';',autocommit=False,Timeout=1,Trusted_Connection='no',Encrypt='no')
cursor0 = cnxn.cursor()
cursor0.execute("insert into sampledb.dbo.sampletb values (10, 10)")
#cursor0.commit()
#cursor0.rollback()
cursor = cnxn.cursor()
cursor.execute("SELECT * FROM sampledb.dbo.sampletb with(Serializable)")
row = cursor.fetchone()
while row:
print (str(row[0]) + " " + str(row[1]))
row = cursor.fetchone()
success = True
except pyodbc.Error as ex:
retryc += 1
print("Current Timestamps:" + str(datetime.datetime.now()) + "retry count: " + str(retryc))
print("==========================")
print("Error: " + str(ex))
print("==========================")
time.sleep(3)
finally:
cursor.close()
2-2. 実行結果
エラーなく実行した結果が以下です。Select の実行結果が表示されます。
1 1 2 2 3 3 10 10
2-3. sqlcmd で SQL Server に接続しテーブルを参照
Insert を commit していないため、10 の record は insert されていないことが確認できます。
> select * from sampledb.dbo.sampletb; > go c1 c2 ----------- ----------- 1 1 2 2 3 3 (3 rows affected)
▼3. 参考情報
- Quickstart: Install SQL Server and create a database on Ubuntu
- pyodbc https://pypi.org/project/pyodbc/
- Java – SQL Server on Linux トランザクションでクエリを制御する方法 No9
- SQL_ATTR_AUTOCOMMIT (ODBC 1.0)
以上です。参考になりましたら幸いです。