Python – SQL Server on Ubuntu トランザクションでクエリを制御する方法 No.94

自己投資としてチャレンジしている内容を Blog で公開しています。

今回は pyodbc を使って python で SQL Server に接続し、クエリのコミット、ロールバックを行う、トランザクションの実装方法を紹介します。

▼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. 参考情報

  1. Quickstart: Install SQL Server and create a database on Ubuntu
  2. pyodbc https://pypi.org/project/pyodbc/
  3. Java – SQL Server on Linux トランザクションでクエリを制御する方法 No9
  4. SQL_ATTR_AUTOCOMMIT (ODBC 1.0)

以上です。参考になりましたら幸いです。



コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です