Integration von Python mit Vector oder Actian Ingres
Actian Germany GmbH
Januar 12, 2018

Einführung
Heute schauen wir uns an, wie man mit Actian Vector, unserer High-Performance In-Memory-Analytics-Datenbank, und Python, einer der am häufigsten von Datenwissenschaftlern verwendeten Sprachen der letzten Zeit, loslegen kann. Mithilfe der folgenden Techniken können Sie mit Python beginnen und Vector ODBC und JDBC verwenden. (Einige dieser Techniken können Sie auch mit Actian Ingres verwenden; weitere Informationen finden Sie im Abschnitt Referenzen am Ende des Kapitels). Wir werden auch einige einfache Grundfunktionen von CURD (Create, Update, Read und Delete) mit Python besprechen.
Der folgende Code wurde mit Python 2.7 32-bit getestet. Wenn Sie neu in Vector sind, sollte diese Einrichtung 2-3 Stunden dauern, und etwas weniger, wenn Sie sowohl mit Vector als auch mit Python vertraut sind.
Benötigte Module für ODBC und Vector
- Pyodbc (das Sie unter https://mkleehammer.github.io/pyodbc/ erhalten können )
- Vector ODBC-Treiber
Hinweis: pypyodbc würde bei gleicher Konfiguration ebenfalls funktionieren, der folgende Code wurde jedoch mit pyodbc getestet.
ODBC-Verbindung über DSN
In diesem Abschnitt werden wir die Grundlagen der Erstellung von DSN unter Linux und Windows für die ODBC-Verbindung erörtern.
Linux
Um DSN unter Linux zum Laufen zu bringen, muss die Umgebung korrekt eingerichtet sein, damit dies funktioniert. Zusammen mit anderen Vector-Parametern, die Sie mit source .ingVWsh erzeugen (wenn der Installationscode VW ist), muss Folgendes exportiert werden oder Sie können Folgendes in .bashrc hinzufügen, damit ODBC läuft.
ODBCSYSINI=$II_SYSTEM/ingres/files exportieren ODBCSYSINI
Hinweis: Bitte setzen Sie II_ODBC_WCHAR_SIZE, falls erforderlich, gemäß Ihrem ODBC-Treibermanager.
Das Ingres-Dienstprogramm 'iiodbcadmin' kann unter Linux verwendet werden, um einen DSN zu erstellen (siehe Beispiel unten).
Hinweis: Wenn Sie mit dem Ingres-ODBC-Treiber und seinen Einstellungen vertraut sind, können Sie auch die Datei odbc.ini wie im folgenden Beispiel bearbeiten. Die hinzugefügten Details werden im Dienstprogramm "iiodbcadmin" wiedergegeben.
Beispiel:
[ODBC-Datenquellen] MYDSN=Ingres [MyDSN] Treiber=/opt/Actian/VectorVI/ingres/lib/libiiodbcdriver.1.so Beschreibung= Hersteller=Actian Corporation TreiberTyp=Ingres HostName=(lokal) ListenAddress=VI Datenbank=Test ServerTyp=Ingres Nutzer Kennwort=actian
Weitere Einzelheiten hierzu finden Sie unter Konfigurieren einer Datenquelle (Linux)
Windows
Wenn Sie python verwenden, benötigen Sie eine 32-Bit-Client-Laufzeitumgebung, um den 32-Bit-ODBC-DSN zu nutzen. Ebenso benötigen Sie für python eine 64-Bit-Client-Laufzeit, um einen 64-Bit-ODBC-DSN zu erstellen.
Weitere Einzelheiten finden Sie unter Konfigurieren einer Datenquelle (Windows).
Hier ist ein Screenshot eines 32-Bit-DSN:
ODBC-Verbindung in Python
Sie können DSN für die Verbindung verwenden:
import pyodbc as pdb conn = pdb.connect("dsn= MYDSN " )
Mit diesem Benutzernamen und Passwort:
conn = pdb.connect("dsn=TestDSN;uid=Benutzername;pwd=Passwort" )
Hier ein weiteres Beispiel:
conn = pdb.connect("dsn=TestDSN;uid=actian;pwd=actian123" )
Sie können auch eine direkte Verbindung ohne DSN herstellen, indem Sie die verschiedenen Parameter wie im folgenden Beispiel verwenden.
conn = pdb.connect("driver=Ingres;servertype=ingres;server=@localhost,tcp_ip,VW;uid=actian;pwd=actian123;database=test")
Für die JDBC-Verbindung benötigte Module
- jaydebeapipython
- Vector JDBC-Treiber (installiert mit clientruntime von ESD)
Jaydebeapi kann einfach mit 'pip install JayDeBeApi' installiert werden. Wenn Sie pip jedoch aus bestimmten Gründen nicht verwenden können, können Sie die Installation auch manuell durchführen. Sie können den Quellcode von https://github.com/baztian/jaydebeapi auf Ihren Computer herunterladen. Entpacken Sie ihn und führen Sie 'python setup.py install' aus. Für die manuelle Installation müssen Sie jedoch die Dev-Tools unter root installieren (yum install gcc-c++ ).
JDBC-Verbindung in Python
import jaydebeapi as jdb conn = jdb.connect('com.ingres.jdbc.IngresDriver','jdbc:ingres://localhost:VI7/test' ,driver_args={'user': 'actian', 'password': 'actian'}, jars='iijdbc.jar') cursor = conn.cursor()
Beispiel: Tabelle erstellen und Werte einfügen (Erstellen in CURD)
Ein einfacher Einsatz
Cursor = conn.cursor()
#Tabelle fallen lassen:
cursor .execute("DROP TABLE IF EXISTS customer")
#Tabelle erstellen:
cursor.execute("CREATE TABLE kunde(kunden_nummer INT NOT NULL PRIMARY KEY,nachname VARCHAR(40),vorname CHAR(40))") conn.commit()
#Zeilen in die Kundentabelle einfügen:
cursor .execute("INSERT INTO customer VALUES (1, 'Harry', 'Potter')") cursor .execute("INSERT INTO customer VALUES (2, 'Ron','Weasley')") cursor .execute("INSERT INTO customer VALUES (3, 'Draco', 'Malfoy')")
Um einzelne Anweisungen auszuführen, wird .execute() verwendet.
Einfügen mit Bindungsvariablen
Um viele Zeilen mit Hilfe von Bindungsvariablen einzufügen, können Sie wie folgt vorgehen:
#Zeilen in die Kundentabelle einfügen:
cursor .execute("INSERT INTO customer VALUES (?, ?, ?)", 4,'A', 'B')
Einfügen mehrerer Zeilen mit .executemany()
Daten =[
(1, 'Harry', 'Potter'),
(2, 'Ron', 'Weasley'),
(3, 'Draco', 'Malfoy')]
cursor.executemany("INSERT INTO customer VALUES (?,?,?)",data)
#Falls Sie Daten nur in bestimmte Spalten einfügen müssen,
Daten =[ (8, 'A', ), (9, 'B',), (10, 'C', )] cursor.executemany("insert into kunde(kunden_nummer, vorname) VALUES(?, ?)", data)
Ein weiteres Beispiel für das Einfügen vieler Zeilen
Wenn die Werte in der Spalte in bestimmten Bereichen hinzugefügt werden sollen, wie im folgenden Beispiel, werden die Elemente in testid der Tabelle test von 0 bis 99 hinzugefügt:
cursor .execute("DROP TABLE IF EXISTS test")
#CREATING TABLE zum Einfügen vieler Zeilen mit executemany()
cursor .execute("CREATE TABLE test(testid varchar(100))") data_to_insert = [(i,) for i in range(100)] cursor.executemany("INSERT INTO test (testid) VALUES (?)", data_to_insert) conn.close();
Daten aktualisieren (die Aktualisierung in cUrd)
Aktualisieren einer einzelnen Zeile
updatedata= ('X', 'Y', 10) sql = 'UPDATE customer SET last_name =? , vor_name=? where kunden_nummer =? ' cursor.execute(sql, updatedata)
Abrufen von Daten (das Lesen in cuRd)
Eine Zeile abrufen
Es gibt viele Funktionen zum Abrufen von Daten wie #fetchone(), fetchall(), etc:
cursor.execute("select count(*) from customer") result=cursor.fetchone() print(ergebnis[0]) cursor.close() conn.close()
Viele Zeilen abrufen
cursor.execute("select First 3 * from customer") for row in cursor: print ("Kundennummer: ",Zeile[0]," Vorname: ",Zeile[2]," Nachname: ",Zeile[2]) cursor.close() conn.close()
Die Ergebnisse werden wie folgt angezeigt:
Kundennummer: 1 Vorname: Potter Nachname: Töpfer
Kundennummer: 2 Vorname: Weasley Nachname: Weasley
Kundennummer: 3 Vorname: Malfoy Nachname: Malfoy
Löschen von Daten (das Löschen in curD)
Löschen einer einzelnen Zeile
sql = 'DELETE from customer where customer_no =9' cursor.execute(sql)
Löschen von mehreren Zeilen
#Löschen Sie mehrere Zeilen mit 'in':
id_list = [1,2,3] Anfrage= "delete from customer where customer_no in (%s)" % ','.join(['?'] * len(id_list)) cursor.executeAnfrage, id_list) Vollständiger Code für ODBC /JDBC
Importieren Sie pyodbc als pdb:
conn = pdb.connect("dsn=TestDSN;uid=vidisha;pwd=vidisha" ) #conn= pdb.connect("driver=Ingres;servertype=ingres;server=@localhost,tcp_ip,VW;uid=vidisha;pwd=vidisha;database=test") # Python 2.7 conn.setdecoding(pdb.SQL_CHAR, encoding='utf-8') conn.setdecoding(pdb.SQL_WCHAR, encoding='utf-8') conn.setencoding(str, encoding='utf-8') conn.setencoding(unicode, encoding='utf-8') conn.autocommit= True cursor = conn.cursor() print("DROPPING TABLE") cursor .execute("DROP TABLE IF EXISTS customer") conn.commit print("nCREATING TABLE ") cursor .execute("CREATE TABLE kunde(kunden_nummer INT NOT NULL PRIMARY KEY,nachname VARCHAR(40),vorname CHAR(40))") print("INSERTING ROWS TO TABLE customer") cursor.execute("INSERT INTO kunde VALUES (1, 'Harry', 'Potter')") cursor.execute("INSERT INTO kunde VALUES (2, 'Ron','Weasley')") cursor.execute("INSERT INTO customer VALUES (3, 'Draco', 'Malfoy')") daten =[ (5, 'Harry', 'Potter'), (6, 'Ron','Weasley'), (7, 'Draco', 'Malfoy')] cursor.executemany("INSERT INTO customer VALUES (?,?,?)",data) #oder Daten =[ (8, 'A', ), (9, 'B',), (10, 'C', )] cursor.executemany("insert into kunde(kunden_nummer, vorname) VALUES(?, ?)", data) print("DROPPING TABLE") cursor.execute("DROP TABLE IF EXISTS test") print("TABELLE ERSTELLEN, um viele Zeilen mit executemany() einzufügen") cursor.execute("CREATE TABLE test(testid varchar(100))") data_to_insert = [(i,) for i in range(100)] print(" multiple data in test einfügen") cursor.executemany("INSERT INTO test (testid) VALUES (?)", data_to_insert) print("COUNT OF TABLE abrufen") cursor.execute("select count(*) from customer") ergebnis=cursor.fetchone() print(ergebnis[0]) print("FETCHING MANY ROWS") cursor.execute("select First 3 * from customer") ergebnisse=cursor.fetchall() for row in results: print ("Kundennummer: ",Zeile[0]," Vorname: ",Zeile[2]," Nachname: ",Zeile[2]) print("EINZELNE ZEILE AKTUALISIEREN") updatedata= ('X', 'Y', 10) sql = 'UPDATE kunde SET nachname = ? , vor_name=? where kunden_nummer =? ' cursor.execute(sql, updatedata) print("LÖSCHEN EINER ZEILE") sql = 'DELETE from customer where customer_no =9' cursor.execute(sql) print("LÖSCHEN MEHRERER ZEILEN MIT 'IN'") id_list = [1,2,3] Anfrage= "delete from customer where customer_no in (%s)" % ','.join(['?'] * len(id_list)) cursor.executeAnfrage, id_list) #Verbindung schließen cursor.close() conn.close()
Für JDBC ist der Code gleich, nur die Verbindungszeichenfolge ist anders:
import jaydebeapi as jdb conn = jdb.connect('com.ingres.jdbc.IngresDriver','jdbc:ingres://localhost:VW7/test' ,driver_args={'user': 'vidisha', 'password': 'vidisha'},jars='iijdbc.jar') cursor = conn.cursor() print("DROPPING TABLE") cursor .execute("DROP TABLE IF EXISTS customer") conn.commit print("nCREATING TABLE ") cursor .execute("CREATE TABLE customer(customer_no INT NOT NULL PRIMARY KEY,last_name VARCHAR(40),first_name CHAR(40))") print("INSERTING ROWS TO TABLE customer") cursor.execute("INSERT INTO customer VALUES (1, 'Harry', 'Potter')") cursor.execute("INSERT INTO customer VALUES (2, 'Ron','Weasley')") cursor.execute("INSERT INTO customer VALUES (3, 'Draco', 'Malfoy')")
Zusätzliche Referenzen:
- Actian Vector Produktseite und Anleitungen
- pyodbc
- JayDeBeAPI
- Ein ausführlicheres Beispiel mit Python, Vector und Ingres
Abonnieren Sie den Actian Blog
Abonnieren Sie den Blog von Actian, um direkt Dateneinblicke zu erhalten.
- Bleiben Sie auf dem Laufenden - Holen Sie sich die neuesten Informationen zu Data Analytics direkt in Ihren Posteingang.
- Verpassen Sie keinen Beitrag: Sie erhalten automatische E-Mail-Updates, die Sie informieren, wenn neue Beiträge veröffentlicht werden.
- Ganz wie sie wollen: Ändern Sie Ihre Lieferpräferenzen nach Ihren Bedürfnissen.