4

使用:Python 2.7.3 SQLAlchemy 0.7.8 PyODBC 3.0.3

我已经使用 PyODBC 作为底层数据库驱动程序为 EXASolution DB 实现了我自己的方言。我需要利用 PyODBC 的output_converter函数将DECIMAL(x, 0)列转换为整数/长整数。

以下代码片段可以解决问题:

pyodbc = self.dbapi
dbapi_con = connection.connection

dbapi_version = dbapi_con.getinfo(pyodbc.SQL_DRIVER_VER)
(major, minor, patch) = [int(x) for x in dbapi_version]
if major >= 3:
    dbapi_con.add_output_converter(pyodbc.SQL_DECIMAL, self.decimal2int)

initialize(self, connection)我已将此代码段放在

    class EXADialect_pyodbc(PyODBCConnector, EXADialect):

代码被调用,并且没有抛出异常,但这是一次性初始化。稍后,将创建其他连接。这些连接没有通过我的初始化代码传递。

有没有人暗示连接初始化如何与 SQLAlchemy 一起工作,以及在哪里放置我的代码以便为每个创建的新连接调用它?

4

1 回答 1

0

这是一个老问题,但我最近遇到了一些问题,所以更新的答案可能会帮助其他人。在我的例子中,我试图自动降低 mssqlUNIQUEIDENTIFIER列(guid)。

您可以通过会话或引擎获取原始连接 (pyodbc) 来执行此操作:

engine = create_engine(connection_string)
make_session = sessionmaker(engine)
...
session = make_session()

session.connection().connection.add_output_converter(SQL_DECIMAL, decimal2int)

# or

connection = engine.connect().connection
connection.add_output_converter(SQL_DECIMAL, decimal2int)
于 2021-12-28T19:36:01.367 回答