2017-11-14 3 views
0

Ich versuche, eine einfache Merge Join-Abfrage auf Microsoft SQL Server mit Python SQL Alchemy Core ausführen.SQL Merge Join zwei Tabellen aus zwei separaten Datenbanken

Zunächst lassen Sie mich erklären, wie es das Server-Management-Studio getan mit:

MERGE [Database1].[Schema1].[Table1] table1 
USING [Database2].[Schema2].[Table2] table2 
ON table1.[Key] = table2.[Key] 
WHEN MATCHED THEN 
UPDATE 
SET table1.[Column] = table2.[Column]; 

Dies funktioniert gut und die Column erfolgreich eingestellt.

Aber wenn ich dies mit 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() 

Es passiert nichts, keine Ausnahme ausgelöst, und die Column Werte sind nicht betroffen.

Ich habe SQL Server-Profiler überprüft und sichergestellt, dass die Abfrage gesendet wird.

Ich habe versucht, mehr einfache Abfragen ausführen, wie:

q="SELECT * FROM TABLE1" 

funktioniert gut.

Was scheint hier das Problem zu sein?

Antwort

1

SQLAlchemy erkennt die MERGE-Anweisung standardmäßig nicht als Datenänderungsoperation und gibt daher keine Festschreibung aus, wenn Sie eine Verbindung verwenden, ohne eine Transaction zu verwenden. Sie sollten "Understanding Autocommit" lesen. Also entweder eine explizite Transaktion verwenden:

with conn.begin() as trans: 
    conn.execute(q) 

oder SQLAlchemy informieren, dass diese Aussage sollte Autocommit:

conn.execute(text(q).execution_options(autocommit=True)) 

Als beiseite, unterstützt Python mehrzeilige Strings mit dreifachen Anführungszeichen ohne Schrägstriche, wenn Sie speziell vermeiden wollen die Zeilenumbrüche:

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];"""