Lange Zeit (ungefähr 3 Monate) habe ich "SQL-Skript ausführen" der IBM Client-Lösung verwendet, um SQL auszugeben und Daten zu erfassen. Da die Anzahl der Daten jedoch 5000 überstieg, wollte ich alle Daten erfassen. Da es mühsam wurde, endlos zu scrollen, versuchte ich ein Batch-Erfassungsexperiment mit Python und ODBC.
Da es sich um einen experimentellen Code handelt, werden die Fehlerprüfung und das Ausgabeergebnisformat ignoriert.
PC-Umgebung
Verbindungszielumgebung
Holen Sie sich den neuesten Stabilisator von python.org und installieren Sie ihn. Legen Sie nach der Installation den Pfad in den Ordner mit "python.exe".
Der Grund, warum ich pypyodbc anstelle des allgemeinen pyodbc gewählt habe, ist, dass die Installation mit pip fehlgeschlagen ist. Ich habe auch IBMs empfohlene ibm_db ausprobiert, aber diesmal ist es ein Pfad, da beide Microsoft Visual C ++ 14 benötigten.
Installieren Sie mit "pip" an Python.
pip install pypyodbc
Ich habe es vor ein paar Monaten eingestellt, damit ich mich an den Inhalt erinnere. Gehen Sie zu https://www.ibm.com/support/pages/ibm-i-access-client-solutions. Folgen Sie dem Link "Downloads für IBM i Access Client-Lösungen". Sie werden unterwegs aufgefordert, Ihre IBM ID zu authentifizieren. Wenn Sie also eine ID haben, geben Sie diese ein, andernfalls registrieren Sie eine neue (kostenlos). Klicken Sie zum Herunterladen auf "ACS Windows App Pkg English (64bit)".
Da es im Installationsformat vorliegt, installieren Sie es gemäß dem Installationsverfahren.
odbctest.py
import pypyodbc
#Verbindungsinformationen abrufen
config = {}
with open("connection_config.txt", 'r', encoding="utf-8") as conf:
for line in conf.read().splitlines():
key_, val_ = line.replace(" ", "").split("=")
config[ key_ ] = val_
#DB-Verbindung
connection = pypyodbc.connect(
driver='{iSeries Access ODBC Driver}',
system = config["system"],
uid = config["uid"],
pwd = config["pwd"] )
cur = connection.cursor()
#SQL-Ausführung
statement = open("statement.sql", 'r', encoding="utf-8").read()
cur.execute( statement )
for row in cur:
print( row )
Die Quelle ist grob in 3 Teile unterteilt.
"Verbindungsinformationen abrufen" ruft die Verbindungsinformationen aus einer externen Datei in die Datenbank ab und speichert sie im Wörterbuch. Die externe Datei "connection_config.txt" sieht folgendermaßen aus:
connection_config.txt
system = xxx.xxx.xxx.xxx
uid = USER
pwd = PASWORD
Bei "DB-Verbindung" wird anhand der gelesenen Verbindungsinformationen versucht, eine Verbindung zur Datenbank herzustellen und den Cursor abzurufen.
Bei "SQL-Ausführung" wird das in die externe Datei geschriebene SQL gelesen und an execute () des Cursors übergeben, um das SQL auszugeben. Die for-Schleife darunter wirft jede Zeile in die Funktion print () und schreibt sie in die Standardausgabe.
statement.sql
select * from QSYS2.LIBLIST
Lassen Sie uns die obige SQL in Anweisung.sql schreiben und ausführen.
>python testodbc.py
(1, 'QSYS', 'QSYS', 'SYSTEM', 0, '\x0eäýäþämäwäáäÝäbäJäÝäÞäì\x0f')
(2, 'QSYS2', 'QSYS2', 'SYSTEM', 0, 'CPI\x0eá¶àªäýäþämäwäáäÝäbäJäÝäÞäì\x0f')
(3, 'QHLPSYS', 'QHLPSYS', 'SYSTEM', 0, None)
(4, 'QUSRSYS', 'QUSRSYS', 'SYSTEM', 0, 'S Mohe Hoote L Caine Ane Mo Kanane U Heone He')
(5, 'QIWS', 'QIWS', 'PRODUCT', 0, None)
(6, 'QGPL', 'QGPL', 'USER', 0, 'GENERAL PURPOSE LIBRARY')
(7, 'QTEMP', 'QTEMP', 'USER', 0, None)
Verstümmelte Charaktere sind beabsichtigt ... Die Beschriftungen einiger von IBM bereitgestellter Objekte scheinen nicht gut zu übersetzen. Wenn es sich jedoch um eine normal erstellte Tabelle handelt, verwenden Sie Japanisch, unabhängig davon, ob Sie SQL- oder AS / 400-spezifische Funktionen verwenden Konvertiert es in Zeichen, die problemlos gelesen werden können.
Wenn Sie zu einer Datei umleiten, sollten Zehntausende von Ergebnissen Sekunden bis Zehntelsekunden dauern. Obwohl dies von der Leistung des Servers abhängt, wurde der Schreibvorgang in ca. 5 Sekunden abgeschlossen (Ausgabedateigröße 1 MB), als ich versuchte, 15 Spalten x 10000 Datensätze und eine etwas größere Menge an SQL auszuführen.
Dies befreit Sie von den Strafen, wenn Sie die Seitentaste endlos gedrückt halten, um die vollständige Ergebnismenge zu erhalten.
Recommended Posts