使用cx_Oracle和sqlalchemy查询的类型转换不正确

时间:2019-02-15 12:27:27

标签: python oracle sqlalchemy type-conversion cx-oracle

我有一个cx_Oracle引擎,定义如下:

e = create_engine('oracle://username:password@(DESCRIPTION='
                  '(ADDRESS=(PROTOCOL=TCP)(HOST=127.0.0.1)(PORT=1521))'
                  '(CONNECT_DATA=(SERVICE_NAME=ORCLPDB1.localdomain)))')

如果我这样使用RAW SQL进行两个不同数据类型的查询(首先是int,然后是str

print(e.execute('SELECT 1 FROM DUAL').scalar())
print(e.execute("SELECT 'qwerty' FROM DUAL").scalar())

它工作正常。而且,正如我所料,

1
'qwerty'

但是,当我使用SQLAlchemy构建这样的查询时:

print(e.execute(sa.select([sa.literal(1)])).scalar())
print(e.execute(sa.select([sa.literal('qwerty')])).scalar())

第一个查询成功运行,显示1,但是第二个查询失败,并显示:

DatabaseError: (cx_Oracle.DatabaseError) ORA-01722: invalid number [SQL: 'SELECT :param_1 AS anon_1 FROM DUAL'] [parameters: {'param_1': 'qwerty'}] (Background on this error at: http://sqlalche.me/e/4xp6)

看起来,在完成第一个查询之后,引擎/方言机制内部的某种方式假定所有后续查询也都将需要整数结果值(如果我跳过整数查询,则没有错误)。不知道这是驱动程序还是SA问题。

为每种查询创建一个新的引擎实例可以解决此问题,但实际上不是我希望的解决方案。

版本:

DB: Oracle Database Server 12.2.0.1
Oracle tools: 18.3.0.0.0
SQLAlchemy==1.2.17
cx-Oracle==7.1.0

0 个答案:

没有答案