Datenarchitektur

Integration von Python mit Vector oder Actian Ingres

Actian Germany GmbH

Januar 12, 2018

Leistungstests von Produktions-Workloads für Ingres und Vector

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

  1. Pyodbc (das Sie unter https://mkleehammer.github.io/pyodbc/ erhalten können )
  2. 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).

Actian Vector VI Ingres Bildschirmfoto

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:

Ingres VT ODBC Bildschirmfoto

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

  1. jaydebeapipython
  2. 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 avatar logo

Über Actian Corporation

Actian macht Daten einfach. Unsere Datenplattform vereinfacht die Verbindung, Verwaltung und Analyse von Daten in Cloud-, Hybrid- und lokalen Umgebungen. Mit jahrzehntelanger Erfahrung in den Bereichen Datenmanagement und -analyse liefert Actian leistungsstarke Lösungen, die es Unternehmen ermöglichen, datengesteuerte Entscheidungen zu treffen. Actian wird von führenden Analysten anerkannt und wurde für seine Leistung und Innovation mit Branchenpreisen ausgezeichnet. Unsere Teams präsentieren bewährte Anwendungsfälle auf Konferenzen (z. B. Strata Data) und tragen zu Open-Source-Projekten bei. Im ActianBlog behandeln wir Themen wie Echtzeit-Dateneingabe, Datenanalyse, Data Governance, Datenmanagement, Datenqualität, Datenintelligenz und KI-gesteuerte Analysen.