У меня есть 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)))')
Если я сделаю два запроса разных типов данных (сначала int
, затем str
), используя RAW SQL, например так:
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