在Python中以只读方式连接SQL Server



我正在尝试使用pyodbc连接到python中的SQL服务器。我无法连接,因为我的数据库是只读的。我尝试了其他链接提供的解决方案:

import pyodbc
readonly_conn_str = "DRIVER={SQL Server};SERVER=...; DATABASE=...;readonly=True;"
conn = pyodbc.connect(readonly_conn_str)

但是,我仍然得到以下错误:

ProgrammingError: ('42000', "[42000] [Microsoft][ODBC SQL Server Driver][SQL Server]目标数据库('PRMOperationalDB')在可用性组中,当应用程序意图设置为只读时,当前连接可访问。有关应用程序意图的更多信息,请参阅SQL Server联机图书。(978) (SQLDriverConnect);[42000] [Microsoft][ODBC SQL Server Driver]无效的连接字符串属性(0);[42000] [Microsoft][ODBC SQL Server Driver][SQL Server]目标数据库('PRMOperationalDB')在可用性组中,当应用程序意图设置为只读时,当前连接可访问。有关应用程序意图的更多信息,请参阅SQL Server联机图书。(978);[42000] [Microsoft][ODBC SQL Server Driver]无效的连接字符串属性(0)")

有什么建议来解决这个问题吗?

readonly=True是pyodbc的connect()方法的属性,而不是传递给SQL Server的连接字符串的一部分。IMHO尝试只是传递所有属性,而不是建立一个完整的连接字符串:

conn = pyodbc.connect(driver='{SQL Server}', host=<server>, database=<db>,
trusted_connection='yes', user='', password='', readonly = True)

或者,像你提到的答案一样,使用:

conn = pyodbc.connect('driver={ODBC Driver 17 for SQL Server};'
+ 'SERVER=...;DATABASE=...;'
+ 'UID=' + user + ';PWD=' + password + ';'
+ 'ApplicationIntent=ReadOnly')

另外,您是否有意显式连接到次要服务器?为什么不连接到AG名称,如果你的应用程序只做读操作,那么最坏的情况是(如果,比如说,有人破坏了只读路由),这些读操作发生在主服务器上。你的代码永远不应该连接到一个特定的物理主机/集群节点,并假设它永远是一个只读的次要节点……如果明天发生故障转移,会发生什么?谁在更新所有的连接字符串?

相关内容

  • 没有找到相关文章