【问题标题】:SQL Merge Join two tables from two separate databasesSQL Merge 连接来自两个不同数据库的两个表
【发布时间】:2018-04-27 04:21:49
【问题描述】:

我正在尝试使用 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"

工作得很好。

这里似乎有什么问题?

【问题讨论】:

    标签: python sql-server join merge sqlalchemy


    【解决方案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];"""
    

    【讨论】:

      猜你喜欢
      • 2020-12-06
      • 2014-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多