【问题标题】:Merge raw sql statement is not working is sqlalchemy connection execute合并原始 sql 语句不起作用是 sqlalchemy 连接执行
【发布时间】:2020-01-30 14:13:12
【问题描述】:

当我们使用 sqlalchemy 通过 python 执行原始合并 sql 语句时,它不会添加预期的行并且执行显示为从 python 成功,但是当在 db 中执行查询时,表中填充了所需的数据。对于下面相同的代码,如果我使用 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 成功但数据没有插入到 DB 的表中

【问题讨论】:

  • 请编辑您的问题以定义您所说的“不工作”是什么意思。它会出错吗?它不会添加预期的行吗?还有什么?

标签: python sql oracle merge sqlalchemy


【解决方案1】:

对于我使用 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

【讨论】:

    猜你喜欢
    • 2020-04-29
    • 1970-01-01
    • 2014-02-06
    • 2012-08-06
    • 2018-01-16
    • 2017-04-20
    • 1970-01-01
    • 2021-12-05
    • 2020-01-16
    相关资源
    最近更新 更多