【问题标题】:Sql Server Merge Statement in PythonPython 中的 Sql Server 合并语句
【发布时间】:2016-04-05 22:42:43
【问题描述】:

我将 sqlalchemy / pyodbc 与 MS SQL Server 一起使用,并尝试执行原始 SQL 合并语句。如果我将查询字符串粘贴到 SQL Server Management Studio 中,它可以正常工作,但我似乎无法通过 Python 让它工作。我环顾四周,似乎找不到关于类似问题的问题。我意识到这很可能是由特定于我的设置的问题驱动的,但我希望有人能够帮助或至少为我指明正确的方向。最小的例子如下:

import sqlalchemy as sa
engine = sa.create_engine('[your engine]')
metadata = sa.MetaData(engine)

t1 = sa.Table('test1', metadata, 
              sa.Column('id', sa.Integer, primary_key=True, autoincrement=False),
              sa.Column('name', sa.String(50)), schema='dbo')
t2 = sa.Table('test2', metadata, 
              sa.Column('id', sa.Integer, primary_key=True, autoincrement=False),
              sa.Column('name', sa.String(50)), schema='dbo')
t1.create()
t2.create()

query = "INSERT INTO dbo.test1 (id, name) VALUES (5, 'someguy')"
engine.execute(query)
mq = """MERGE dbo.test2 AS Target USING dbo.test1 AS Source ON
        Target.id = Source.id
        WHEN MATCHED THEN 
             UPDATE SET Target.name = Source.name
        WHEN NOT MATCHED BY TARGET THEN
             INSERT (id, name) VALUES (Source.id, Source.name);"""
engine.execute(mq)

【问题讨论】:

  • 在我看来,它看起来不错。您遇到错误了吗?
  • 没有错误,没有任何异常 - dbo.test2 中只有 0 行。
  • 你如何验证零行?在 SSMS 中?您是否有可能在您的应用程序中进行某种(未提交的)事务?
  • 设置为自动提交。我可以很好地运行其他查询并立即查看结果。例如,如果我手动尝试从 t1 运行 insert INTO t2 它可以工作。我也尝试过运行插入,然后更改 t1,然后重新运行到合并以查看更新是否触发而不是插入。但似乎两者都不起作用。
  • 我只是将查询拆分为更新和插入语句。它似乎工作正常。不确定我是否只是偶然发现了一些奇怪的错误,或者只是在我身上发生了一些奇怪的事情。

标签: python sql-server


【解决方案1】:

我也遇到了类似的问题(语句可以在 SSMS 中执行,但在 Python 中运行时什么也不做)。这是我如何让它工作的:

conn = engine.connect()
conn = conn.execution_options(autocommit=True)
conn.execute(stmt)
conn.close()

以 stmt 作为合并语句。

【讨论】:

  • 我不知道为什么另一个不起作用,但这个在第一次尝试时也对我有用!非常感谢你分享这个,你让我很开心!
猜你喜欢
  • 2011-07-05
  • 2011-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-19
  • 1970-01-01
相关资源
最近更新 更多