我在尝试创建只读连接时遇到了一些问题,不确定是错误还是错误。
Pyodbc的文档表明可以创建只读连接。看见https://mkleehammer.github.io/pyodbc/api-module.html
当运行以下内容时,我没有收到任何错误,并且它运行时就好像READONLY关键字根本不存在一样(更新完成)。
import pyodbc
readonly_conn_str = "DRIVER={SQL Server Native Client 10.0};SERVER=...;DATABASE=...;UID=...;PWD=...;READONLY=True;"
conn = pyodbc.connect(readonly_conn_str)
cursor = conn.cursor()
result = cursor.execute(update_query)
cursor.commit()
print(result.rowcount)
如果我尝试使用函数关键字,我会得到同样的结果。
...
conn = pyodbc.connect(conn_str, readonly=True)
...
当我们用readonly=True
调用pyodbc.connect
时,pyodbc会尽职尽责地调用ODBC函数
ret = SQLSetConnectAttr(cnxn->hdbc, SQL_ATTR_ACCESS_MODE, (SQLPOINTER)SQL_MODE_READ_ONLY, 0);
SQL_MODE_READ_ONLY
是标准ODBCSQL_ATTR_ACCESS_MODE
属性之一。这将如何实际影响ODBC连接的行为取决于ODBC驱动程序。如ODBC文档中所述:
SQL_MODE_READ_ONLY被驱动程序或数据源用作一个指标,表明不需要连接来支持导致更新的SQL语句。此模式可用于优化锁定策略、事务管理或适用于驱动程序或数据源的其他区域。驱动程序不需要阻止此类语句提交到数据源。驱动程序和数据源在只读连接期间被要求处理非只读SQL语句时的行为是由实现定义的。
换句话说,pyodbc已经将"只读"属性传递给ODBC驱动程序。这取决于驾驶员来决定它是否应该被解释为一个提示、一个硬限制或是一个可以简单忽略的东西。