与mssql和pyodbc的只读连接

时间:2017-02-08 00:49:11

标签: python sql-server pyodbc

我在尝试创建只读连接时遇到了一些麻烦,并且不确定它是否是错误或我的错误。

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)
...

1 个答案:

答案 0 :(得分:1)

当我们用pyodbc.connect调用readonly=True时,pyodbc尽职尽责地调用ODBC函数

ret = SQLSetConnectAttr(cnxn->hdbc, SQL_ATTR_ACCESS_MODE, (SQLPOINTER)SQL_MODE_READ_ONLY, 0);

SQL_MODE_READ_ONLY是标准ODBC SQL_ATTR_ACCESS_MODE属性之一。实际上如何影响ODBC连接的行为取决于ODBC驱动程序。如ODBC documentation中所述:

  

驱动程序或数据源使用SQL_MODE_READ_ONLY作为指示连接不需要支持导致更新发生的SQL语句的指示符。此模式可用于优化锁定策略,事务管理或适用于驱动程序或数据源的其他区域。不要求驱动程序阻止将此类语句提交给数据源。当被要求处理在只读连接期间不是只读的SQL语句时,驱动程序和数据源的行为是实现定义的。

换句话说,pyodbc已通过"只读"属性为ODBC驱动程序。由驾驶员决定是否应将其解释为提示,严格限制或简单忽略的内容。

相关问题