首页 > 解决方案 > 如何在执行任何语句之前调用连接方法

问题描述

我正在尝试通过 sqlalchemy 连接到 SQL Server 上的数据库。我可以通过 pyodbc 建立连接,但是,我必须调用conn.setencoding('utf-8')连接以使其能够解码我的查询(如此所述)。

在 sqlalchemy 中,引擎第一次建立连接时,它会查询服务器版本并发出一些其他测试查询。这些查询在正常设置引擎时失败,但我通过使用creator参数让它们工作create_engine。唉,所有后续查询仍然以 old 失败UnicodeDecodeError: 'utf-8' codec can't decode byte 0x80 in position 1: invalid start byte,因此似乎只在第一个连接上调用了 creator 函数。我希望它用于每个连接,因为这是sqlalchemy 文档中所述:

creator——一个可调用的,它返回一个 DBAPI 连接。此创建函数将传递到底层连接池,并将用于创建所有新的数据库连接。

这是我的设置:

connectstring = f"DRIVER={DRIVER};" \
                f"SERVER={SERVER};" \
                f"PORT={PORT};" \
                f"DOMAIN={DOMAIN};" \
                f"USER={USER};" \
                f"PASSWORD={PASSWORD};" \
                f"DATASOURCE={DATASOURCE};" \
                f"ENCRYPT={ENCRYPT}"

def connect():
    conn = pyodbc.connect(connectstring)
    conn.setencoding('utf-8')
    return conn


engine = create_engine("mssql://", creator=connect, echo="debug", echo_pool="debug")
c = engine.connect()

所以,我的问题是如何确保.setencoding('utf-8')在每个新创建的连接上调用它?我已经尝试过不同的 PoolEvents(如此处所述,但没有运气。

编辑

pyodbc 是 4.0.25 版
sqlalchemy 是 1.2.16 版

此外,我正在连接到一个数据虚拟化服务器,该服务器又访问 SQL Server。我已经使用 sqlalchemy 成功地建立了与 SQL Server 本身的连接,所以似乎是 DV 层引入了问题。

标签: pythonsql-serversqlalchemypyodbc

解决方案


推荐阅读