避免在只读 Sybase 连接上出现 BEGIN TRANSACTION 错误



我想使用 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)")
Python 的

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来避免此类问题。

相关内容

  • 没有找到相关文章

最新更新