如何在执行任何语句之前调用连接方法

2024-04-27 04:54:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试通过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层引入了这个问题。你知道吗


Tags: 引擎版本服务器sql参数heresqlalchemyconnect