我正在尝试使用python SQL Alchemy核心在Microsoft SQL Server上执行简单的合并连接查询。
首先让我解释一下如何使用服务器管理工作室完成:
MERGE [Database1].[Schema1].[Table1] table1
USING [Database2].[Schema2].[Table2] table2
ON table1.[Key] = table2.[Key]
WHEN MATCHED THEN
UPDATE
SET table1.[Column] = table2.[Column];
此工作正常,Column
已成功设置。
但是当我使用python执行此操作时:
DB_TARGET = {
'drivername': 'mssql+pyodbc',
'servername': 'localhost',
'port': '1443',
'username': 'user1',
'password': 'pass',
'driver': 'ODBC Driver 13 for SQL Server',
'trusted_connection': 'yes',
'legacy_schema_aliasing': False
}
params = urllib.parse.quote_plus("DRIVER={" + DB_TARGET['driver'] + "}" +
";SERVER=" + DB_TARGET['servername'] +
";UID=" + DB_TARGET['username']+
";PWD=" + DB_TARGET['password'])
engine1 = create_engine( DB_TARGET['drivername'] + ":///?odbc_connect=%s" % params)
metadata = MetaData(bind=engine1)
conn = engine1.connect()
q="MERGE [Database1].[Schema1].[Table1] table1 \
USING [Database2].[Schema2].[Table2] table2 \
ON table1.[Key] = table2.[Key] \
WHEN MATCHED THEN \
UPDATE \
SET table1.[Column] = table2.[Column];"
conn.execute(q)
conn.close()
没有任何反应,没有抛出异常,Column
值不受影响。
我检查过SQL Server分析器并确保正在提交查询。
我尝试执行更简单的查询,例如:
q="SELECT * FROM TABLE1"
工作得很好。
这里似乎有什么问题?
答案 0 :(得分:1)
SQLAlchemy默认情况下不会将MERGE语句识别为数据更改操作,因此在不使用Transaction
的情况下使用连接时不会发出提交。你应该阅读"Understanding Autocommit"。所以要么使用显式事务:
with conn.begin() as trans:
conn.execute(q)
或通知SQLAlchemy此语句应自动提交:
conn.execute(text(q).execution_options(autocommit=True))
顺便说一下,Python支持带有三引号的多行字符串,没有反斜杠,除非你特别想避免使用换行符:
q = """MERGE [Database1].[Schema1].[Table1] table1
USING [Database2].[Schema2].[Table2] table2
ON table1.[Key] = table2.[Key]
WHEN MATCHED THEN
UPDATE
SET table1.[Column] = table2.[Column];"""