Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中的Sql Server合并语句_Python_Sql Server - Fatal编程技术网

Python中的Sql Server合并语句

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(

我正在MS SQL Server中使用sqlalchemy/pyodbc,并尝试执行原始SQL合并语句。如果我将查询字符串粘贴到SQLServerManagementStudio中,它可以正常工作,但我似乎无法从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)

我也遇到了类似的问题(语句可以在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并插入到语句中。它似乎工作得很好。我不知道我是不是碰巧遇到了什么奇怪的虫子,还是我这边发生了什么奇怪的事情。