我有一个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