2017-05-31 3 views
0

Ich habe eine psycopg Verbindung:Wie kann ich eine Ergebnismenge von psycopg2 mit pyodbc in eine SQL-Tabelle einfügen?

conngre = psycopg2.connect("host='blah' port='blah' dbname='blah' user='blah' password='blah'") 
conngre = conngre.cursor() 

with open('exportgre', 'r') as selectexport: 
    var1 = selectexport.read() 
    conngre.execute(var1) 

Dieses eine resultset nennt, die ich will, um dann mit Verbindung SQL Server vordefinierte Tabelle Dump in:

sqlconn = pyodbc.connect(r'DSN=d;UID=blah;PWD=blah') 
cursql = sqlconn.cursor() 

with open('importsql', 'r') as selectexport: 
    var2 = selectexport.read() 
    cursql.execute(var2) 

Ist thier eine Möglichkeit, die Ergebnisse aus der zu übergeben erstes Ergebnis in eine Einfügung für die zweite Ergebnismenge gesetzt?

Ich habe lief nun den folgenden Code als Test, um diese vor der Verwendung meiner eigentlichen SQL zur Arbeit zu kommen:

import pyodbc 

sqlconn = pyodbc.connect(r'DSN=d;UID=blah;PWD=blah') 
cursql = sqlconn.cursor() 

with cursql.execute("select * from blah.dbo.export_test"): 

rows = cursql.fetchall() 

for row in rows: 
    cursql.execute('insert into TouchStar.dbo.export_test values (?)', (row[0])) 
    print(row) 

Allerdings scheint es, nur meine Daten überschreiben, die bereits in der Tabelle?

Muss ich irgendwie anhängen?

+0

Können Sie ein Beispiel für die SQL-Abfragen angeben, die Sie in den Dateien 'exportgre' und' importsql' ausführen? Ich bin mir nicht sicher, wie sich die zwei Dateien, über die Sie sprechen, auf die Lösung des Problems beziehen. Wenn ich versuche, von einem PostreSQL zu lesen und auf SQL Server zu schreiben, wähle ich einfach die Zeilen aus PostgreSQL aus, führe eine Schleife darüber und füge das, was ich brauche, in SQL Server ein, ohne irgendwelche Dateien zu verwenden. Die PostgreSQL-'fetchmany'-Methode kann verwendet werden, um eine bestimmte Anzahl von Zeilen gleichzeitig zu erfassen und eine einzelne Einfügung unter Verwendung von SQL Server' executemany' zu erzeugen. – FlipperPA

+0

Ich kann nicht wirklich die genauen Spalten als Firma empfindlich einschließen, aber die Tabellen sind für wie, aber haben eine Datum extrahierte Spalte am Anfang der sql Tabelle. –

Antwort

1

Sie sollten Python-Wörterbücher in der Mitte verwenden. Wählen Sie zunächst aus PostgreSQL mit RealDictCursor:

conngre = psycopg2.connect("host='blah' port='blah' dbname='blah' user='blah' password='blah'", cursor_factory=psycopg2.extras.RealDictCursor) 
curgre = conngre.cursor() 

sqlconn = pyodbc.connect(r'DSN=d;UID=blah;PWD=blah') 
cursql = sqlconn.cursor() 

with open('exportgre', 'r') as selectexport: 
    var1 = selectexport.read() 
    curgre.execute(var1) 
    rows = curgre.fetchall() 
    for row in rows: 
     cursql.execute('INSERT INTO table_name (col1, col2, col3) VALUES (?, ?, ?)', (row[0], row[1], row[2])) 

Für jede SELECT-Anweisung in "selectexport", dies wird die Abfrage und Schleife über die Zeilen laufen. Für jede Zeile wird es in den Pyodbc-Cursor eingefügt. Sie müssen die Insert-Anweisung anpassen, um zu passen. Viel Glück!

+0

Hallo FlipperPA Entschuldigung für die Verspätung Ich werde heute Nachmittag daran arbeiten. Wird dadurch eine SQL-Transaktion pro Zeile erstellt? Oder wird es das gesamte Wörterbuch zusammentragen und dann alle auf einmal ausführen, ist meine Datenmenge etwa 12.000 Zeilen, so dass sich 12.000 Abfragen der Reihe nach nicht leisten können. –

+0

Dies würde 12000 Abfragen einfügen. Sie könnten stattdessen 'executemany' aus pyodbc oder' execute' verwenden. – FlipperPA

+0

Hallo FlipperPA Ich habe meine Frage mit Code bearbeitet, dass ich versucht habe, pyodbc zu pyodbc zu testen, da meine postgre-Verbindung derzeit nicht verfügbar ist. –

Verwandte Themen