【问题标题】:Readonly connection with mssql and pyodbc与 mssql 和 pyodbc 的只读连接
【发布时间】:2026-01-23 07:25:02
【问题描述】:

我在尝试创建只读连接时遇到了一些问题,但不确定这是错误还是我的错误。

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

【问题讨论】:

  • 您遇到错误了吗?它在哪里不起作用?什么行为?
  • 对不起。我已将问题更新为更清楚
  • 也许是只读,小写?这就是它在文档中的显示方式,并没有传递给 ODBC 驱动程序进行解释。

标签: python sql-server pyodbc


【解决方案1】:

当我们用readonly=True 调用pyodbc.connect 时,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 驱动程序。由驱动程序决定是否应将其解释为提示、硬限制或简单忽略的内容。

【讨论】:

  • 你如何追踪 pyodbc 这样的行为?我想弄清楚如何从关键字 args 中设置 applicationintent=readonly
  • @chorbs - 两种主要方法是检查source code 和/或创建ODBC trace