Python中的Sql Server合并语句
我正在MS SQL Server中使用sqlalchemy/pyodbc,并尝试执行原始SQL合并语句。如果我将查询字符串粘贴到SQLServerManagementStudio中,它可以正常工作,但我似乎无法从Python中使用它。我环顾了一下四周,似乎找不到关于类似问题的问题。我意识到这很可能是由我的设置特定的问题驱动的,但我希望有人能够帮助我,或者至少为我指出正确的方向。最简单的例子如下:Python中的Sql Server合并语句,python,sql-server,Python,Sql Server,我正在MS SQL Server中使用sqlalchemy/pyodbc,并尝试执行原始SQL合并语句。如果我将查询字符串粘贴到SQLServerManagementStudio中,它可以正常工作,但我似乎无法从Python中使用它。我环顾了一下四周,似乎找不到关于类似问题的问题。我意识到这很可能是由我的设置特定的问题驱动的,但我希望有人能够帮助我,或者至少为我指出正确的方向。最简单的例子如下: import sqlalchemy as sa engine = sa.create_engine(
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)
我也遇到了类似的问题(语句可以在SSMS中执行,但在Python中运行时什么也不做)。以下是我如何让它工作的:
conn = engine.connect()
conn = conn.execution_options(autocommit=True)
conn.execute(stmt)
conn.close()
用stmt作为merge语句。从表面上看,我觉得很好。您是否遇到了错误?没有错误,没有异常情况-dbo.test2中只有0行。如何验证零行?在SSMS中?您的应用程序中是否存在某种(未提交的)事务?它已设置为自动提交。我可以很好地运行其他查询并立即看到结果。例如,如果我手动尝试从t1将insert运行到t2中,它就会工作。我还尝试运行insert-in,然后更改t1,然后重新运行到merge,以查看更新是否触发的只是insert。但这两种方法似乎都不起作用。我只是将查询拆分为和update并插入到语句中。它似乎工作得很好。我不知道我是不是碰巧遇到了什么奇怪的虫子,还是我这边发生了什么奇怪的事情。