【发布时间】: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