Неверное преобразование типов с запросами cx_Oracle и sqlalchemy - PullRequest
0 голосов
/ 15 февраля 2019

У меня есть 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
...