我想使用 python 与只读数据库建立 32 位 odbc 连接。我已安装
C:py_comp>c:Python27Scriptspip.exe install pyodbc
Collecting pyodbc
Downloading pyodbc-4.0.19-cp27-cp27m-win32.whl (50kB)
100% |################################| 51kB 1.1MB/s
Installing collected packages: pyodbc
Successfully installed pyodbc-4.0.19
并打开了只读连接
conn = pyodbc.connect(r'uid=xxxx;pwd=xxxx;DRIVER={Adaptive Server Enterprise};port=1234;server=11.222.333.444;CHARSET=iso_1;db=my_db;readonly=True')
以上所有工作正常,但是当我尝试进行选择
cursor.execute("SELECT something FROM atable")
我收到一个错误,因为它发出了一个begin transaction
但它不应该这样做。
pyodbc.Error: ('ZZZZZ', u"[ZZZZZ] [Sybase][ODBC Driver][Adaptive Server Enterprise]Attempt to BEGIN TRANSACTION in database 'my_db' failed because database is READ ONLY.n (3906) (SQLExecDirectW)")
DB API 2.0 指定,默认情况下,应在关闭"autocommit"的情况下打开连接,以便在必须显式提交(或回滚)的事务中执行对数据库的操作。这可能导致在每批Cursor#execute
调用之前将BEGIN TRANSACTION
发送到数据库,这可能会导致无法在事务中执行的操作出现问题(例如,某些 DDL 语句)。
pyodbc 允许我们在连接上启用"自动提交",方法是将其作为参数添加到 connect
调用
cnxn = pyodbc.connect(conn_str, autocommit=True)
或在建立连接后启用它
cnxn = pyodbc.connect(conn_str)
cnxn.autocommit = True
这可以通过在执行 SQL 命令之前抑制自动BEGIN TRANSACTION
来避免此类问题。