使用:Python 2.7.3SQLAlchemy 0.7.8PyODBC 3.0.3
我已经使用PyODBC作为底层数据库驱动程序为EXASolution数据库实现了我自己的方言。我需要使用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,以及将我的代码放在哪里,以便为创建的每个新连接调用它吗?
这是一个老问题,但我最近遇到了一些问题,所以更新后的答案可能会对其他人有所帮助。在我的例子中,我试图自动降低mssqlUNIQUEIDENTIFIER
列(guids)的大小。
您可以通过会话或引擎获取原始连接(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)