python - 如何在执行任何语句之前调用连接方法
问题描述
我正在尝试通过 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 层引入了问题。
解决方案
推荐阅读
- javascript - 无法从 Fetch api 和 JSON 解析数据
- .net - 从构建或发布管道在 azure devops 中发布 nuget 包
- c# - 当 streamwriter 语句使用 void 和 int 时,如何解决布尔错误?
- algorithm - 任何关于具有完美信息的有限二部图游戏的游戏/图论?
- angular - 有没有办法在 Angular 7 中为模板 html 属性 *key* 使用变量?
- java - 如何使用eclipse在java中打印带下划线的字符串
- go - httputil.NewSingleHostReverseProxy 调用会增加内存使用量
- python-3.x - 从 Tkinter 中的回调函数中检索信息
- python - 创建时将用户设置为组
- swift - 如何获取要正确更新的实体数量