Anschluss von IBM AS400-server, die für die Datenbank-Operationen hängt
Ich versuche zu sprechen, um eine AS400 in Python. Das Ziel ist die Verwendung von SQLAlchemy, aber wenn ich konnte nicht bekommen, dass die Arbeit, ging ich wieder zu einem basic-Skript mit nur ibm_db statt ibm_db_sa.
import ibm_db
dbConnection = ibm_db.pconnect("DATABASE=myLibrary;HOSTNAME=1.2.3.4;PORT=8471;PROTOCOL=TCPIP;UID=username;PWD=password", "", "") #this line is where it hangs
print ibm_db.conn_errormsg()
Scheint das problem zu sein der port. Wenn ich die 50000 sehe ich in allen Beispielen, bekomme ich eine Fehlermeldung. Wenn ich 446, bekomme ich eine Fehlermeldung. Der verblüffende Teil ist dies: wenn ich 8471, die IBM sagt zu tun, bekomme ich keine Fehlermeldung, kein timeout, keine Antwort zu löschen. Ich habe das Skript ausgeführt, die über zwanzig Minuten, und es sitzt nur da, tut nichts. Es ist aktiv, denn ich kann nicht verwenden Sie den Befehl-Eingabeaufforderung, aber Sie gibt mir nie irgendein feedback jeglicher Art.
Diese gleichen 400 wird von der Firma für die ich arbeite jeden Tag, für die Protokollierung, E-Mail, und (große) Datenbank-Nutzung, so dass ich weiß, dass es funktioniert. Die software, die wir verwenden, die spricht, um die Datenbank hinter den kulissen läuft Prima auf meinem Rechner. Das sagt mir, mein Treiber ist gut, die Netzwerk-Einstellungen richtig sind, und so weiter. Ich kann auch mit telnet in den 400 von hier.
Ich bin auf der SQLAlchemy und ibm_db-E-Mail-Listen, und kommunizieren mit Ihnen seit Tagen über dieses problem. Ich habe auch gegoogelt es so sehr, ich bin angefangen zu laufen, von un-besuchte links in meine Suchergebnisse. Niemand scheint das problem der Verbindung hängen auf unbestimmte Zeit. Wenn es etwas gibt, kann ich versuchen in Python, ich werde es versuchen. Ich beschäftige mich nicht mit der 400 direkt, aber ich kann den Kerl Fragen, der hat zu überprüfen/konfigurieren was ich brauche. Wie ich sagte, obwohl, mehreren Arbeitsplätzen sprechen kann, die die 400-Datenbank mit keine Probleme und die Abfragen ausführen, die gegen die Bibliothek, die ich zugreifen will, funktioniert gut, wenn Sie von der 400 selbst. Wenn jemand irgendwelche Vorschläge, ich würde schätzen, hören Sie. Danke!
- Wenn Sie weiter auf dieser, es wäre toll, wenn Sie gemeinsam hier. Ich war stochern den code für
ibm_db_sa
um zu sehen, ob etwas sprang mich an, und etwas Tat: Diepyodbc.py
Modul innerhalbibm_db_sa
hat eine Klasse namensAS400Dialect_pyodbc
, und es hat den richtigen Wert fürpyodbc_driver_name
. Also klar mindestens einige Versuch wurde gemacht, um SQLAlchemy arbeiten mit DB2 für ich. - Habe ich noch nicht. Gut, meine app ist bewegt, aber für jetzt bin ich verlassen Sie sich nur auf pyodbc. Ich habe SA durch die Verbindung zu pyodbc, dann vorbei an der Funktion, welche die Verbindung zu create_engine, aber das hat nicht funktioniert.
- Wie viel nicht mit der zusätzliche Funktionalität von SQLAlchemy zu verletzen? Und wie gut kennen Sie (a) wissen, Python und (b) wissen, SQLAlchemy? Der Grund warum ich Frage ist, weil durch ein bisschen mehr stochern und stupsen, ich habe es geschafft zu bekommen
create_engine()
um erfolgreich erstellen ein Motor, und die Verwendung der engine zu tun nackt SQL-Abfragen. In anderen Worten, ich kann machen SQLAlchemy dienen als eine äußerst wechselhafte wrapper für PyODBC, für die kein Wert Hinzugefügt. Ich bin glücklich zu teilen, meine Erkenntnisse, aber ich habe noch nie verwendet, ORM, so kann es durchaus sein, weitere Probleme lauern über, bevor Sie voll nutzen können SQLAlchemy. - Also Woher dein wissen kommt in ist, wenn es mehr Experimente und Fixierung, die getan werden muss, können Sie haben, die ärmel hochkrempeln und Holen Sie sich Ihre Hände ein wenig schmutzig.
- Ich fühle mich wohl in Python, aber ich bin neu in SQLAlchemy. Der Hauptgrund für mich, die SA ist die Bequemlichkeit von ORM, also wenn alle damit umgehen können, ist gerade SQL, ich denke, ich kann auch stick zu pyodbc. Vielen Dank für das follow-up, obwohl.
- Naja, nicht aufgeben, auf das ORM, bevor Sie versuchen, es zuerst. Ich weiß, es wird funktionieren völlig, sobald Sie beheben die ODBC-Verbindung wie ich beschrieben habe in meiner Antwort.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den README für
ibm_db_sa
nur Listen DB2 für Linux/Unix/Windows in die "Unterstützte Datenbank" Abschnitt. So ist es wahrscheinlich nicht für DB2 für i, zumindest nicht direkt aus der box.Da Sie erklärt habe, Sie haben IBM System i Access für Windows empfehle ich nur mit einem der Treiber, die mit ihm kommt (ODBC, OLEDB, oder ADO.NET wie @Charles erwähnt).
Ich persönlich habe immer die ODBC verwenden, entweder
pyodbc
oderpypyodbc
. Entweder man funktioniert gut. Ein einfaches Beispiel:Nun, SQLAlchemy Verbindung von Methoden ist
pyodbc
, so würde ich denken, dass, wenn Sie eine Verbindung mitpyodbc
Volltreffer, kann man das irgendwie konfigurieren, SQLAlchemy, das gleiche zu tun. Aber ich bin nicht ein SQLAlchemy-Nutzer selbst, so habe ich nicht den Beispiel-code für die.UPDATE
Schaffte ich es, SQLAlchemy, um eine Verbindung zu den IBM-i-und ausführen gerade SQL-Abfragen. In anderen Worten, um es über die gleichen Funktionen wie die einfache Verwendung von PyODBC direkt. Ich noch nicht getestet, alle anderen SQLAlchemy bietet. Was ich getan habe, die Verbindung auf meinem Windows 7-Maschine:
Installieren
ibm_db_sa
als SQLAlchemy DialektSie können in der Lage sein zu verwenden
pip
für diese, aber ich habe es getan die low-tech-Weg:ibm_db_sa
von PyPI.Wie dies Schreibe, die aktuelle version ist version 0.3.2, hochgeladen auf 2014-10-20. Es ist denkbar, dass spätere Versionen werden entweder behoben werden oder gebrochen in verschiedenen Arten (so in der Zukunft, die änderungen, die ich bin, zu beschreiben, möglicherweise nicht erforderlich, oder Sie können nicht arbeiten).
ibm_db_sa-0.3.2.tar.gz
) und kopieren Sie die beiliegendenibm_db_sa
- Verzeichnis in dassqlalchemy\dialects
Verzeichnis.Ändern
sqlalchemy\dialects\ibm_db_sa\pyodbc.py
initialize()
Methode, um dieAS400Dialect_pyodbc
KlasseDer Punkt von diesem ist das überschreiben der Methode mit dem gleichen Namen in
DB2Dialect
, dieAS400Dialect_pyodbc
erbt von. Das problem ist, dassDB2Dialect.initialize()
versucht, zum festlegen der Attributedbms_ver
unddbms_name
, welche nicht verfügbar oder relevant, wenn eine Verbindung zu IBM i mit PyODBC (soweit ich das sagen kann).dialect
und legen Sie es auf dieAS400Dialect_pyodbc
KlasseCode für die oben genannten änderungen gehen sollte am Ende der Datei, und sehen so aus:
Beachten Sie die Einkerbung! Denken Sie daran, die
initialize()
Methode muss gehören zu denAS400Dialect_pyodbc
Klasse, unddialect
muss global sein, um das Modul.Schließlich, Sie brauchen, um zu geben den Motor Schöpfer das Recht URL:
(Offensichtlich ist, ersetzen Sie gültige Werte für
username
,password
, undhost
.)Das ist es. An diesem Punkt sollten Sie in der Lage zu schaffen, die engine, eine Verbindung zu dem ich, und ausführen plain SQL über SQLAlchemy. Ich würde denken, eine Menge von der ORM-Zeug sollte auch an diesem Punkt, aber ich haben nicht überprüft.
Den Weg, um herauszufinden, welchen port benötigt wird, ist der Blick auf die Dienst-Tabelleneinträge auf der IBM i.
Ihre IBM i-Typ verwenden können, das iNav-GUI oder das green-screen-Arbeit mit Service-Tabelle (WRKSRVTBLE) Befehl
Sollten einen Bildschirm wie so:
Wird der Standard-port für die DB ist in der Tat 8471. Obwohl drda verwendet wird, für "verteilte db" - Operationen.
Basierend auf dieser thread, zu verwenden ibm_db, um eine Verbindung zu DB2 auf einem IBM i müssen Sie die IBM Connect-Produkt; ist eine kommerzielle Verpackung, die bezahlt werden muss.
Diese thread empfiehlt die Verwendung von ODBC über die pyodbc-Modul. Dies deutet auch darauf hin, dass JDBC, über die JT400-toolkit kann auch arbeiten.
Hier ist ein Beispiel für die Arbeit mit as400, sqlalchemy und pandas.
Diese exammple nehmen eine Reihe von csv-Dateien und einfügen mit pandas/sqlalchemy.
Funktioniert nur für windows, bei linux wird der i-Reihe odbc-Treiber segfaults (Centos 7 und Debian 9 x68_64)
Client ist Windows 10.
Meine as400 version 7.3
Python ist 2.7.14
installiert mit pip: pandas, pyodbc, imb_db_sa, sqlalchemy
Müssen Sie zum installieren von i access für windows aus der ftp://public.dhe.ibm.com/as400/products/clientaccess/win32/v7r1m0/servicepack/si66062/
Nachholen, die änderung @JohnY auf pyodbc.py
C:\Python27\Lib\site-packages\sqlalchemy\dialects\ibm_db_sa\pyodbc.py
Ändern Sie Zeile 99 zu
Den odbc-Treiber umbenannt.
Hoffe, es hilft.
Wenn Sie nicht brauchen, Pandas/SQLAlchemy, verwenden Sie einfach pyodbc, wie vorgeschlagen, in John Y s Antwort. Ansonsten können Sie versuchen, zu tun, was für mich gearbeitet, unten. Es ist aus meiner Antwort zu meine eigene, ähnliche Frage, die Sie heraus überprüfen können, die für mehr detail auf, was nicht Arbeit (ich habe versucht, und konnte nicht in so viele Möglichkeiten, bevor man es arbeiten).
Ich erstellt eine leere Datei in meinem Projekt zu beschwichtigen, diese Nachricht, die ich erhielt:
(Mein Projekt-Ordner ist
C:/Git/dashboards
, so habe ich den rest des Weges.)Mit, dass die Datei vorhanden, wird der code unten funktioniert jetzt für mich. Für das Protokoll, es scheint zu funktionieren, unabhängig davon, ob die
ibm_db_sa
Modul geändert, wie vorgeschlagen, in John Y s Antwort, so würde ich empfehlen, das Modul allein. Beachten Sie, dass obwohl Sie nicht importiert direkt, müssen Sie diese Module installiert:pyodbc
,ibm_db_sa
, und möglicherweisefuture
(bei Verwendung von Python 2...habe ich vergessen, falls es nötig ist). Wenn Sie mit Python 3, ich müssen Sieurllib.parse
statturllib
. Ich habe auch ich auf 7.1 Treiber auf meinem computer installiert, die wahrscheinlich ins Spiel kam.