我正在尝试通过sqlalchemy连接到SQL服务器上的数据库。我可以通过pyodbc建立连接,但是,我必须调用连接上的conn.setencoding('utf-8')
,以使它能够解码我的查询(如here所述)。你知道吗
在sqlalchemy中,引擎第一次建立连接时,它会查询服务器版本并发出一些其他测试查询。这些查询在正常设置引擎时失败,但是我使用creator
参数使它们工作,该参数是create_engine
接受的。唉,所有后续的查询仍然会失败,因为旧的UnicodeDecodeError: 'utf-8' codec can't decode byte 0x80 in position 1: invalid start byte
,所以creator函数似乎只在第一个连接上被调用。我希望它能用于每个连接,因为这就是sqlalchemy docs中所说的:
creator – a callable which returns a DBAPI connection. This creation function will be passed to the underlying connection pool and will be used to create all new database connections.
这是我的设置:
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服务器本身的连接,所以似乎是DV层引入了这个问题。你知道吗
目前没有回答
相关问题 更多 >
编程相关推荐