Оператор слияния raw sql не работает, выполняется соединение sqlalchemy - PullRequest
2 голосов
/ 01 октября 2019

Когда мы выполняем необработанный SQL-оператор слияния через python с использованием sqlalchemy, он не добавляет ожидаемые строки и выполнение, показываемое как успешное из python, но когда запрос был выполнен в БД, таблица заполняется необходимыми данными. Для того же кода ниже, если я использую какое-либо обновление или оператор выбора из Python, он успешно выдавал ожидаемый результат

from sqlalchemy.sql import text
from sqlalchemy import create_engine, types
oracle_connection_string = ('oracle+cx_oracle://{username}:{password}@'+
                       cx_Oracle.makedsn('{hostname}', '{port}', service_name='{service_name}'))

engine = create_engine(oracle_connection_string.format(
                    username='test',
                    password ='test',
                    hostname='test.com',
                    port='1521',
                    service_name='test.net'
                    ))
pop_stmt = """merge into test1 a
using (select id from test2) b
on (a.id= b.id)
when not matched then
insert (a.id) values (b.id)"""

with engine.connect() as con:
     con.execute(text(pop_stmt).execution_options(autocommit=True))

Здесь мы не получаем никакой ошибки, выполнение оператора показывает успешное выполнение из Python, но данныене был вставлен в таблицу в БД

1 Ответ

0 голосов
/ 12 октября 2019

Это утверждение работает отлично для моего использования sqlalchemy.__version__ '1.3.10' и Oracle 12.2.0.1.0

Вы можете проверить количество объединенной строки, используя rs.rowcount

Убедитесь, чтоВы используете простые тестовые данные, которые легко проверяются, например:

create table test1 as
select 1 id  from dual;

create table test2 as
select 1 id  from dual union all
select 2 id  from dual
;

Этот отсканированный возвращает 1 объединенную строку (здесь вставлено , поскольку вы не обновите ) как и ожидалось:

pop_stmt = """merge into test1 a
using (select id from test2) b
on (a.id= b.id)
when not matched then
insert (a.id) values (b.id)"""

with engine.connect() as con:
    rs =  con.execute(text(pop_stmt).execution_options(autocommit=True))
    print(rs.rowcount)

1
...