Die Verbindung zum IBM AS400-Server für Datenbankvorgänge hängt nicht

8

Ich versuche mit einem AS400 in Python zu sprechen. Das Ziel ist es, SQLAlchemy zu verwenden, aber als ich das nicht zum Laufen bringen konnte, trat ich mit ibm_db anstelle von ibm_db_sa zurück zu einem einfacheren Skript.

%Vor%

Das Problem scheint der Port zu sein. Wenn ich den 50000 in allen Beispielen benutze, erhalte ich einen Fehler. Wenn ich 446 benutze, erhalte ich einen Fehler. Der verwirrende Teil ist dies: wenn ich 8471 verwende, die IBM sagt, ich soll tun bekomme keinen Fehler, keine Zeitüberschreitung, keine Antwort. Ich habe das Skript für über zwanzig Minuten laufen lassen, und es sitzt einfach da und tut nichts. Es ist aktiv, weil ich die Eingabeaufforderung überhaupt nicht verwenden kann, aber es gibt mir keinerlei Rückmeldung.

Dieselbe 400 wird von der Firma verwendet, für die ich jeden Tag arbeite, zum Loggen, E-Mailen und (sehr viel) Datenbankbenutzung, also weiß ich, dass es funktioniert. Die von uns verwendete Software, die im Hintergrund mit der Datenbank kommuniziert, läuft auf meinem Rechner einwandfrei. Das sagt mir mein Treiber ist gut, die Netzwerkeinstellungen sind richtig, und so weiter. Ich kann sogar telnet in die 400 von hier.

Ich bin in den E-Mail-Listen SQLAlchemy und ibm_db und habe seit Tagen mit ihnen über dieses Problem gesprochen. Ich habe es auch so viel gegooglet, dass mir nicht mehr besuchte Links in meinen Suchergebnissen ausgehen. Niemand scheint das Problem zu haben, dass die Verbindung auf unbestimmte Zeit hängt. Wenn es irgendetwas gibt, was ich in Python ausprobieren kann, werde ich es versuchen. Ich beschäftige mich nicht direkt mit den 400, aber ich kann den Typ fragen, der alles überprüft / konfiguriert, was ich brauche. Wie ich bereits sagte, können mehrere Workstations problemlos mit der Datenbank von 400 kommunizieren, und Abfragen, die für die Bibliothek ausgeführt werden, auf die ich zugreifen möchte, funktionieren einwandfrei, wenn sie von der 400 selbst ausgeführt werden. Wenn jemand irgendwelche Vorschläge hat, würde ich es sehr schätzen, sie zu hören. Danke!

    
AH16 17.02.2016, 15:47
quelle

3 Antworten

8

README für ibm_db_sa listet nur DB2 für Linux / Unix / Windows in der Abschnitt "Unterstützte Datenbank". Es funktioniert also höchstwahrscheinlich nicht für DB2 für i, zumindest nicht sofort.

Da Sie angegeben haben, dass Sie IBM System i Access für Windows verwenden, empfehle ich dringend, nur einen der mitgelieferten Treiber zu verwenden (ODBC, OLEDB oder ADO.NET, wie @Charles erwähnt).

Persönlich verwende ich immer ODBC, entweder mit pyodbc oder pypyodbc . Beides funktioniert gut. Ein einfaches Beispiel:

%Vor%

Nun, eine der Verbindungsmethoden von SQLAlchemy ist pyodbc , also würde ich denken, wenn Sie eine Verbindung direkt mit pyodbc herstellen können, können Sie SQLAlchemy auf ähnliche Weise konfigurieren. Aber ich bin selbst kein SQLAlchemy-Benutzer, daher habe ich keinen Beispielcode dafür.

AKTUALISIEREN

Ich habe SQLAlchemy dazu gebracht, eine Verbindung zu unserem IBM i herzustellen und gerade SQL-Abfragen auszuführen. Mit anderen Worten, um es in etwa mit der gleichen Funktionalität wie PyODBC direkt zu verwenden. Ich habe keine anderen SQLAlchemy-Funktionen getestet. Was ich getan habe, um die Verbindung auf meinem Windows 7-Rechner einzurichten:

  • Installieren Sie ibm_db_sa als SQLAlchemy-Dialekt Sie können möglicherweise pip dafür verwenden, aber ich habe es auf die Low-Tech-Art gemacht:

    1. Laden Sie ibm_db_sa von PyPI herunter.
      Zu diesem Zeitpunkt ist die neueste Version 0.3.2, die am 20.10.2014 hochgeladen wurde. Es ist vorstellbar, dass spätere Versionen entweder auf verschiedene Arten repariert oder unterbrochen werden (in Zukunft werden die Änderungen, die ich beschreiben werde, möglicherweise unnötig sein oder sie könnten nicht funktionieren).
    2. Entpacken Sie das Archiv ( ibm_db_sa-0.3.2.tar.gz ) und kopieren Sie das beigefügte Verzeichnis ibm_db_sa in das Verzeichnis sqlalchemy\dialects .
  • Ändern sqlalchemy\dialects\ibm_db_sa\pyodbc.py

    • Fügen Sie der Klasse initialize() die Methode AS400Dialect_pyodbc hinzu Der Sinn davon ist, die gleichnamige Methode in DB2Dialect zu überschreiben, von der AS400Dialect_pyodbc erbt. Das Problem ist, dass DB2Dialect.initialize() versucht, die Attribute dbms_ver und dbms_name zu setzen, von denen keine verfügbar oder relevant ist, wenn eine Verbindung zu IBM i mit PyODBC hergestellt wird (soweit ich das beurteilen kann).
    • Fügen Sie den Namen der Modul-Ebene dialect hinzu und setzen Sie ihn auf die Klasse AS400Dialect_pyodbc

Code für die obigen Änderungen sollte am Ende der Datei gehen und wie folgt aussehen:

%Vor%

Beachten Sie die Einrückung! Denken Sie daran, dass die Methode initialize() zur Klasse AS400Dialect_pyodbc gehören muss und dialect global für das Modul sein muss.

Schließlich müssen Sie dem Ersteller der Suchmaschine die richtige URL geben:

%Vor%

(Ersetze natürlich gültige Werte für username , password und host .)

Das ist es. Zu diesem Zeitpunkt sollten Sie in der Lage sein, die Engine zu erstellen, eine Verbindung mit dem i herzustellen und SQL SQL über SQLAlchemy auszuführen. Ich würde denken, dass viele der ORM-Sachen auch an dieser Stelle funktionieren sollten, aber ich habe das nicht verifiziert.

    
John Y 18.02.2016, 23:08
quelle
1

Um herauszufinden, welcher Port benötigt wird, sehen Sie sich die Einträge in der Servicetabelle auf dem IBM i an.

Ihr IBM i-Typ kann die iNav-GUI oder den grünen Bildschirm Mit WRKSRVTBLE (Work with Service Table Entry) -Befehl verwenden

Sollte ein Bildschirm wie folgt aussehen:

%Vor%

Der Standard-Port für die DB ist in der Tat 8471. Obwohl drda für "verteilte db" -Operationen verwendet wird.

Basierend auf dieser thread , um ibm_db für die Verbindung zu DB2 auf einem IBM i zu verwenden, benötigen Sie das Produkt IBM Connect. Das ist ein kommerzielles Paket, das bezahlt werden muss.

Dies thread schlägt vor, ODBC über das pyodbc-Modul zu verwenden. Es schlägt auch vor, dass JDBC über das JT400 Toolkit auch funktionieren könnte.

    
Charles 17.02.2016 18:28
quelle
0

Hier ist ein Beispiel, um mit as400, sqlalchemy und Pandas zu arbeiten. Dieses Beispiel nehmen Sie eine Reihe von CSV-Dateien und fügen Sie mit Pandas / sqlalchemy. Funktioniert nur für Windows, auf Linux die i-Serie Odbc-Treiber segfaults (Centos 7 und Debian 9 x68_64)

Client ist Windows 10.

Meine as400-Version ist 7.3

Python ist 2.7.14

installiert mit pip: pandas, pyodbc, imb_db_sa, sqlalchemy

Sie müssen i access für Windows von ftp: // public installieren .dhe.ibm.com / as400 / produkte / clientaccess / win32 / v7r1m0 / servicepack / si66062 /

Zusätzlich die Änderungen von @JohnY auf pyodbc.py C: \ Python27 \ Lib \ Site-Pakete \ sqlalchemy \ Dialekte \ ibm_db_sa \ pyodbc.py Ändern Sie Zeile 99 zu

%Vor%

Der Odbc-Treiber hat seinen Namen geändert.

%Vor%

Ich hoffe, es hilft.

    
ncastrog 29.12.2017 22:11
quelle

Tags und Links