Architecture des données

Intégration de Python avec Vector ou Actian Ingres

Actian Corporation

12 janvier 2018

Tests de performance des charges de travail de production pour Ingres et Vector

Introduction

Aujourd'hui, nous allons voir comment démarrer avec Actian Vector, notrein-memory de haute performance . base de données analytiqueet Python, l'un des langages les plus utilisés par les data scientists ces derniers temps. En utilisant les techniques ci-dessous, vous serez en mesure de démarrer avec Python en utilisant Vector ODBC et JDBC. (Vous pourrez également utiliser certaines de ces techniques avec Actian Ingres; voir la section Références en bas de page pour plus d'informations). Nous aborderons également quelques fonctions de base simples de CURD (Create, Update, Read, and Delete) à l'aide de Python.

Le code suivant a été testé avec Python 2.7 32-bit. Si vous ne connaissez pas Vector, cette installation devrait prendre 2 à 3 heures, et un peu moins si vous êtes familier avec Vector et Python.

Modules nécessaires pour ODBC et Vector

  1. Pyodbc (que vous pouvez obtenir sur https://mkleehammer.github.io/pyodbc/)
  2. Pilote ODBC Vector

Note: pypyodbc fonctionnerait également pour la même configuration mais le code suivant a été testé avec pyodbc.

Connexion ODBC à l'aide d'un DSN

Dans cette section, nous aborderons les bases de la création d'un DSN sous Linux et Windows qui sera utilisé par la connexion ODBC.

Linux

Pour que le DSN fonctionne sous Linux, l'environnement doit être configuré correctement. Avec d'autres paramètres Vector que vous obtenez en utilisant la source .ingVWsh (si le code d'installation est VWW), ce qui suit doit être exporté ou vous pouvez ajouter ce qui suit dans .bashrc pour faire fonctionner l'ODBC.

ODBCSYSINI=$II_SYSTEM/ingres/files
export ODBCSYSINI

Note: veuillez définir II_ODBC_WCHAR_SIZE si nécessaire en fonction de votre gestionnaire de pilote ODBC.

L'utilitaire Ingres 'iiodbcadmin' peut être utilisé sous Linux pour créer un DSN, comme le montre l'exemple ci-dessous.

Actian Vector VI Ingres Capture d'écran

Note: Si vous êtes familier avec le pilote ODBC Ingres et ses paramètres, vous pouvez également éditer odbc.ini comme dans l'exemple ci-dessous. Les détails ajoutés seront reflétés dans l'utilitaire 'iiodbcadmin'.

Exemple :

[Sources de données ODBC]
MYDSN=Ingres

[MyDSN]
Driver=/opt/Actian/VectorVI/ingres/lib/libiiodbcdriver.1.so
Description=
Vendeur=Actian Corporation
DriverType=Ingres
Nom d'hôte=(local)
ListenAddress=VI
Database=test
ServerType=Ingres
utilisateur
password=actian

Pour plus de détails, voir Configurer une source de données (Linux)

Fenêtres

Si vous utilisez python 32 bits, vous aurez besoin d'un runtime client 32 bits pour utiliser le DSN ODBC 32 bits. De même, si vous utilisez python 64 bits, vous aurez besoin d'un moteur d'exécution client 64 bits pour utiliser le DSN ODBC 64 bits.

Pour plus de détails, voir Configurer une source de données (Windows).

Voici une capture d'écran d'une DSN 32 bits :

Ingres VT ODBC Capture d'écran

Connexion ODBC en Python

Vous pouvez utiliser le DSN pour vous connecter :

import pyodbc as pdb
conn = pdb.connect("dsn= MYDSN " )

Avec ce nom d'utilisateur et ce mot de passe :

conn = pdb.connect("dsn=TestDSN;uid=username;pwd=password" )

Voici un autre exemple :

conn = pdb.connect("dsn=TestDSN;uid=actian;pwd=actian123" )

Vous pouvez également vous connecter directement sans DSN en utilisant les différents paramètres comme le montre l'exemple ci-dessous.

conn = pdb.connect("driver=Ingres;servertype=ingres;server=@localhost,tcp_ip,VW;uid=actian;pwd=actian123;database=test")

Modules nécessaires à la connexion JDBC

  1. jaydebeapipython
  2. Pilote JDBC Vector (installé à l'aide du clientruntime d'ESD)

Jaydebeapi peut être facilement installé en utilisant 'pip install JayDeBeApi'. Cependant, si pour certaines raisons vous ne pouvez pas utiliser pip, vous pouvez aussi l'installer manuellement. Vous pouvez télécharger le code source à partir de https://github.com/baztian/jaydebeapi sur votre ordinateur. Décompressez et exécutez 'python setup.py install'. Cependant, vous devrez installer les outils de développement à la racine (yum install gcc-c++ ) pour l'installer manuellement.

Connexion JDBC en 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()

Exemple : Création d'un tableau et insertion de valeurs (création dans CURD)

Un simple encart

curseur = conn.curseur()

#Drop table :

cursor .execute("DROP TABLE IF EXISTS customer")

#Créer une table :

cursor.execute("CREATE TABLE customer(customer_no INT NOT NULL PRIMARY KEY,last_name VARCHAR(40),first_name CHAR(40))")

conn.commit()

#Insérer des lignes dans le tableau des clients :

cursor .execute("INSERT INTO customer VALUES (1, 'Harry', 'Potter')")

cursor .execute("INSERT INTO customer VALUES (2, 'Ron', 'Weasley')")

cursor .execute("INSERT INTO client VALUES (3, 'Draco', 'Malfoy')")

Pour exécuter une seule instruction, on utilise .execute().

Insertion à l'aide de variables de liaison

Pour insérer plusieurs lignes à l'aide de variables de liaison, vous pouvez procéder comme suit :

#Insérer des lignes dans le tableau des clients :

cursor .execute("INSERT INTO customer VALUES ( ?, ?, ?)", 4, 'A', 'B')

Insertion de plusieurs lignes à l'aide de .executemany()

données =[

(1, "Harry", "Potter"),
(2, "Ron", "Weasley"),
(3, "Draco", "Malefoy")]

cursor.executemany("INSERT INTO customer VALUES ( ?,?, ?)",data)

#Dans le cas où vous devez insérer des données uniquement dans certaines colonnes,

données =[

(8, 'A', ),
(9, 'B',),
(10, 'C', )]

cursor.executemany("insert into customer(customer_no, first_name) VALUES( ?, ?)", data)

Autre exemple d'insertion de plusieurs lignes

Si les valeurs de la colonne doivent être ajoutées dans certaines plages, comme dans l'exemple suivant, les éléments de la colonne testid du tableau test seront ajoutés de 0 à 99 :

cursor .execute("DROP TABLE IF EXISTS test")

#CREATING TABLE to insert many rows using 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() ;

Mise à jour des données (la mise à jour en cours)

Mise à jour d'une seule ligne

updatedata= ('X', 'Y', 10)

sql = 'UPDATE customer SET last_name = ? , first_name= ? where customer_no = ? '

cursor.execute(sql, updatedata)

Récupérer des données (la lecture dans cuRd)

Récupération d'une ligne

Il existe de nombreuses fonctions pour récupérer des données comme #fetchone(), fetchall(), etc :

cursor.execute("select count(*) from customer")

result=cursor.fetchone()

print(result[0])

cursor.close()

conn.close()

Récupération d'un grand nombre de lignes

cursor.execute("select First 3 * from customer")

for row in cursor :

print ("Numéro de client : ",ligne[0]," Prénom : ",ligne[2]," Nom : ",ligne[2])

cursor.close()

conn.close()

Les résultats seront affichés comme suit :

Cust_no : 1 First Name : Potter Nom de famille : Potter

Cust_no : 2 First Name : Weasley Nom : Weasley

Cust_no : 3 Prénom : Malefoy Nom de famille : Malefoy

Suppression de données (le "Delete" de curD)

Suppression d'une seule ligne

sql = 'DELETE from customer where customer_no =9'

cursor.execute(sql)

Suppression de plusieurs lignes

#Supprimez plusieurs lignes en utilisant "in" :

id_list = [1,2,3]

requête= "delete from customer where customer_no in (%s)" % ','.join(['?'] * len(id_list))

cursor.executerequête, id_list)

Code complet pour ODBC /JDBC

Importer pyodbc en tant que 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 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 client VALUES (1, 'Harry', 'Potter')")
cursor.execute("INSERT INTO client VALUES (2, 'Ron', 'Weasley')")
cursor.execute("INSERT INTO client VALUES (3, 'Draco', 'Malfoy')")

data =[

(5, 'Harry', 'Potter'),
(6, 'Ron', 'Weasley'),
(7, 'Draco', 'Malfoy')]

cursor.executemany("INSERT INTO customer VALUES ( ?,?, ?)",data)

#ou

data =[

(8, 'A', ),
(9, 'B',),
(10, 'C', )]

cursor.executemany("insert into customer(customer_no, first_name) VALUES( ?, ?)", data)

print("DROPPING TABLE")
cursor.execute("DROP TABLE IF EXISTS test")
print("CREATING TABLE to insert many rows using executemany()")
cursor.execute("CREATE TABLE test(testid varchar(100))")
data_to_insert = [(i,) for i in range(100)]
print("Insérer plusieurs données dans test")
cursor.executemany("INSERT INTO test (testid) VALUES ( ?)", data_to_insert)

print("Récupération du COUNT DE LA TABLE")

cursor.execute("select count(*) from customer")
result=cursor.fetchone()
print(result[0])

print("FETCHING MANY ROWS")

cursor.execute("select First 3 * from customer")
results=cursor.fetchall()
for row in results :
    print ("Numéro de client : ",ligne[0]," Prénom : ",ligne[2]," Nom : ",ligne[2])

print("UPDATING SINGLE ROW")
updatedata= ('X', 'Y', 10)
sql = 'UPDATE customer SET last_name = ? , first_name= ? where customer_no = ? '
cursor.execute(sql, updatedata)

print("DELETING A ROW")

sql = 'DELETE from customer where customer_no =9'
cursor.execute(sql)

print("Suppression de plusieurs lignes en utilisant 'IN'")
id_list = [1,2,3]
requête= "delete from customer where customer_no in (%s)" % ','.join(['?'] * len(id_list))
cursor.executerequête, id_list)
#ferme la connexion
cursor.close()
conn.close()

Pour JDBC, le code est le même, seule la chaîne de connexion est différente :

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')")

Références supplémentaires :

 

logo avatar actian

À propos d'Actian Corporation

Actian facilite l'accès aux données. Notre plateforme de données simplifie la façon dont les gens connectent, gèrent et analysent les données dans les environnements cloud, hybrides et sur site . Avec des décennies d'expérience dans la gestion des données et l'analyse, Actian fournit des solutions de de haute performance qui permettent aux entreprises de prendre des décisions basées sur les données. Actian est reconnu par les principaux analystes et a reçu des prix de l'industrie pour sa performance et son innovation. Nos équipes partagent des cas d'utilisation éprouvés lors de conférences (par exemple, Strata Data) et contribuent à des projets à code source ouvert. Sur le blog d'Actian, nous abordons des sujets tels que l'ingestion de données en temps réel, l'analyse de données, la gouvernance données, la gestion des données, la qualité des données, l'intelligence des données et l'analyse pilotée par l'IA.