我正在尝试通过sqlalchemy连接到SQL Server上的数据库。我可以通过pyodbc建立连接,但是,我必须在连接上调用conn.setencoding('utf-8')
,以使其能够解码我的查询(如here所述)。
在sqlalchemy中,引擎第一次建立连接时,会查询服务器版本并发出其他一些测试查询。这些查询在正常设置引擎时会失败,但是我使用creator
所使用的create_engine
参数使它们正常工作。 las,所有后续查询仍然会因旧的UnicodeDecodeError: 'utf-8' codec can't decode byte 0x80 in position 1: invalid start byte
而失败,因此似乎仅在第一个连接上调用了creator函数。我希望它能用于每个连接,因为这是sqlalchemy docs中所述的内容:
创建者 –一个可调用的可返回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(如here所述),但是没有运气。
编辑:
pyodbc是版本4.0.25
sqlalchemy是1.2.16版
此外,我正在连接到数据虚拟化服务器,该服务器依次访问SQL Server。我已经使用sqlalchemy成功建立了到SQL Server本身的连接,所以似乎是DV层引入了该问题。