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

时间:2019-07-17 09:41:59

标签: python sql-server sqlalchemy pyodbc

我正在尝试通过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层引入了该问题。

0 个答案:

没有答案