2009-08-25 6 views
1

Ich schreibe ein Python-Skript, das einige Textdateien verarbeiten wird. Als Teil dieses Prozesses muss ich jede Zeile der durch Tabulator getrennten Datei in eine lokale MS SQL Server (2008) -Tabelle importieren. Ich benutze pyodbc und ich weiß, wie das geht. Ich habe jedoch eine Frage über den besten Weg, es auszuführen.Importieren einer Textdatei in SQL Server in Python

Ich werde durch die Datei durchlaufen, Erstellen eines Cursors.execute (myInsertSQL) für jede Zeile der Datei. Sieht jemand Probleme, die darauf warten, die Anweisungen zu committen, bis alle Datensätze geloopt wurden (d. H. Das commit() nach der Schleife und nicht innerhalb der Schleife nach jeder einzelnen Ausführung)? Der Grund, warum ich frage, ist, dass einige Dateien mehr als 5000 Zeilen haben werden. Ich wusste nicht, ob der Versuch, "sie zu retten" und alle 5000 gleichzeitig zu begehen, Probleme verursachen würde.

Ich bin ziemlich neu zu Python, so dass ich alle diese Probleme noch nicht kenne.

Danke.

+0

"Ich wusste nicht, ob ich versuche, sie zu retten" und alle 5000 auf einmal zu begehen würde Probleme verursachen. " Welche Art von "Problemen" stellst du dir vor? Hast du es versucht? Was hat es getan? Das Verschieben des Commits von der Schleife in das Ende der Schleife ist eine so triviale Änderung, dass Sie beide einfach ausführen und das Gelernte einbeziehen können. –

+0

Ich habe es mit kleineren Sets ausprobiert und hatte kein Problem. Meine Sorge war nicht, dass es nicht funktionieren würde, wenn ich testen würde, aber vielleicht, wenn es eine Decke gäbe, auf die ich achten sollte. Die Dateien variieren in der Größe und können über 5000 gehen. Das Skript, das ich schreibe, wird als Teil eines Zeitplan-Stapels ausgeführt, der in Produktion geht, und ich versuche nur sicherzustellen, dass ich keine Probleme bekomme, indem ich etwas tue, was nicht ist empfohlen. –

+0

Stellt die Python-Schnittstelle zu sqlserver eine '.executemany' Methode zur Verfügung? –

Antwort

0

Wenn ich verstehe, was Sie tun, wird Python kein Problem sein. Das Ausführen einer Anweisung in einer Transaktion erstellt keinen kumulativen Status in Python. Dies geschieht nur auf dem Datenbankserver selbst.

Wenn Sie eine Festschreibung durchführen, müssen Sie sicherstellen, dass die Festschreibung stattgefunden hat, da ein großer Batch-Commit möglicherweise mit intervenierenden Änderungen in der Datenbank kollidiert. Wenn die Übertragung fehlschlägt, müssen Sie den Stapel erneut ausführen.

, dass das einzige Problem ist, dass ich bewusst bin mit großen Chargen und Python/ODBC (und es ist nicht einmal wirklich ein Python Problem, da Sie unabhängig, dieses Problem haben würde.)

Nun, wenn Sie alle kreierten die SQL im Speicher, und dann durch die Speicher-Darstellung, die mehr Sinn machen könnte. Trotzdem sind 5000 Textzeilen auf einer modernen Maschine wirklich keine große Sache. Wenn Sie zwei Größenordnungen mehr verarbeiten müssen, müssen Sie möglicherweise Ihren Prozess überdenken.

+0

Danke für die Einsicht. Ich denke, dass diese Information, kombiniert mit der obigen Idee, das sein wird, worüber ich nachdenken muss. –

0

Erstellen Sie eine Datei und verwenden Sie BULK INSER T. Es wird schneller sein.

+0

Ich habe BULK INSERT noch nicht benutzt, aber es lohnt sich, einen Blick darauf zu werfen. Da ich dieses Skript morgen fertig haben muss, werde ich den ersten Ansatz für jetzt nehmen und BULK INSERT erneut besuchen, wenn ich mehr Zeit habe. Vielen Dank. –

+0

BULK INSERT erfordert möglicherweise zusätzliche Berechtigungen für die Datenbank. Ich weiß, dass ich unseren Systemadministrator nach ihnen fragen musste. – tgray

Verwandte Themen