Integración de Python con Vector o Actian Ingres
Corporación Actian
12 de enero de 2018

Introducción
Hoy vamos a ver cómo empezar a utilizar Actian Vector, nuestrain-memory de datosin-memory de haute performance . base de données analytiquey Python, uno de los lenguajes más utilizados por los científicos de datos en los últimos tiempos. Utilizando las técnicas que se describen a continuación, podrá empezar a utilizar Python con Vector ODBC y JDBC. (También podrá utilizar algunas de estas técnicas con Actian Ingres; consulte la sección Referencias al final para obtener más información). También discutiremos algunas funciones básicas simples de CURD (Crear, Actualizar, Leer y Borrar) usando Python.
El siguiente código está probado con Python 2.7 32-bit. Si eres nuevo en Vector, esta configuración debería llevarte 2-3 horas, y un poco menos si estás familiarizado tanto con Vector como con Python.
Módulos necesarios para ODBC y Vector
- Pyodbc (que puedes conseguir en https://mkleehammer.github.io/pyodbc/)
- Controlador ODBC de Vector
Nota: pypyodbc también funcionaría para la misma configuración sin embargo el siguiente código está probado con pyodbc.
Conexión ODBC mediante DSN
En esta sección discutiremos los fundamentos para hacer DSN tanto en Linux como en Windows para ser usados por la conexión ODBC.
Linux
Para que DSN funcione con Linux, el entorno debe estar configurado correctamente para que funcione. Junto con otros parámetros de Vector que se obtienen usando source .ingVWsh (si el código de instalación es VW) lo siguiente necesita ser exportado o puedes añadir lo siguiente en .bashrc para que ODBC funcione.
ODBCSYSINI=$II_SISTEMA/ingresos/archivos export ODBCSYSINI
Nota: por favor, ajuste II_ODBC_WCHAR_SIZE si es necesario según su gestor de controladores ODBC.
La utilidad 'iiodbcadmin' de Ingres puede usarse en Linux para crear un DSN como el ejemplo que se muestra a continuación.
Nota: Si está familiarizado con el controlador Ingres ODBC y su configuración, también puede editar odbc.ini como en el ejemplo siguiente. Los detalles añadidos se reflejarán en la utilidad 'iiodbcadmin'.
Ejemplo:
[Fuentes de datos ODBC] MYDSN=Ingres [MyDSN] Driver=/opt/Actian/VectorVI/ingres/lib/libiiodbcdriver.1.so Descripción= Fabricante=Actian Corporation Tipo de controlador=Ingres HostName=(local) Dirección de escucha=VI Base de datos=prueba TipoServidor=Ingres usuario=actian contraseña=actian
Para más detalles, consulte Configurar una fuente de datos (Linux)
Windows
Si está utilizando python de 32 bits, necesitará un cliente de 32 bits para hacer uso del DSN ODBC de 32 bits. Del mismo modo, para python de 64 bits, necesitaría tiempo de ejecución de cliente de 64 bits para hacer ODBC DSN de 64 bits.
Encontrará más detalles en Configurar una fuente de datos (Windows).
Aquí hay una captura de pantalla de un DSN de 32 bits:
Conexión ODBC en Python
Puede utilizar DSN para conectarse:
importar pyodbc como pdb conn = pdb.connect("dsn= MYDSN " )
Con este nombre de usuario y contraseña:
conn = pdb.connect("dsn=TestDSN;uid=nombreusuario;pwd=contraseña" )
He aquí otro ejemplo:
conn = pdb.connect("dsn=TestDSN;uid=actian;pwd=actian123" )
O puede conectarse directamente sin ningún DSN utilizando los distintos parámetros como en el ejemplo que se muestra a continuación.
conn = pdb.connect("driver=Ingres;servertype=ingres;server=@localhost,tcp_ip,VW;uid=actian;pwd=actian123;database=test")
Módulos necesarios para la conexión JDBC
- jaydebeapi(https://pypi.python.org/pypi/JayDeBeApi/)
- Vector JDBC driver ( instalado usando clientruntime de ESD)
Jaydebeapi puede ser facilmente instalado usando 'pip install JayDeBeApi'. Sin embargo, si debido a ciertos problemas no puede utilizar pip entonces también puede instalar manualmente. Puedes descargar el codigo fuente desde https://github.com/baztian/jaydebeapi en tu ordenador. Descomprima y ejecute 'python setup.py install' . Sin embargo, tendrías que instalar las herramientas de desarrollo en la raíz (yum install gcc-c++ ) para instalarlo manualmente.
Conexión 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()
Ejemplo: Crear tabla e insertar valores (Crear en CURD)
Una simple inserción
cursor = conn.cursor()
#Drop table:
cursor .execute("DROP TABLE IF EXISTS customer")
#Crear tabla:
cursor.execute("CREAR TABLA cliente(no_cliente INT NOT NULL PRIMARY KEY,apellido VARCHAR(40),nombre CHAR(40))") conn.commit()
#Insertar filas en la tabla de clientes:
cursor .execute("INSERT INTO customer VALUES (1, 'Harry', 'Potter')") cursor .execute("INSERT INTO cliente VALUES (2, 'Ron','Weasley')") cursor .execute("INSERTAR EN cliente VALORES (3, 'Draco', 'Malfoy')")
Para ejecutar sentencias individuales, se utiliza .execute().
Insertar utilizando variables Bind
Para insertar muchas filas utilizando variables bind puede hacer lo siguiente:
#Insertar filas en la tabla de clientes:
cursor .execute("INSERT INTO cliente VALUES (?, ?, ?)", 4,'A', 'B')
Inserción de varias filas mediante .executemany()
datos =[
(1, 'Harry', 'Potter'),
(2, 'Ron','Weasley'),
(3, 'Draco', 'Malfoy')].
cursor.executemany("INSERT INTO cliente VALUES (?,?,?)",datos)
#En caso de tener que insertar datos sólo a determinadas columnas,
datos =[ (8, 'A', ), (9, 'B',), (10, 'C', )] cursor.executemany("insert into cliente(nºcliente, nombre) VALUES(?, ?)", datos)
Otro ejemplo para insertar muchas filas
En caso de que se deban añadir valores a la columna en determinados rangos, como en el siguiente ejemplo, los elementos de testid de la tabla test se añadirán de 0 a 99:
cursor .execute("DROP TABLE IF EXISTS test")
#CREAR TABLA para insertar muchas filas usando executemany()
cursor .execute("CREATE TABLE test(testid varchar(100))") datos_a_insertar = [(i,) for i in range(100)] cursor.executemany("INSERT INTO test (testid) VALUES (?)", data_to_insert) conn.close();
Actualizar datos (la actualización en cUrd)
Actualización de una fila
updatedata= ('X', 'Y', 10) sql = 'UPDATE cliente SET apellido = ? first_name=? where customer_no =? ' cursor.execute(sql, updatedata)
Obtención de datos (la lectura en cuRd)
Búsqueda de una fila
Hay muchas funciones para obtener datos de como #fetchone(), fetchall(), etc.:
cursor.execute("select count(*) from customer") result=cursor.fetchone() print(resultado[0]) cursor.close() conn.close()
Obtención de muchas filas
cursor.execute("select First 3 * from customer") para fila en cursor: print ("Cust_no: ",row[0]," First Name: ",row[2]," Last Name: ",row[2]) cursor.close() conn.close()
Los resultados se mostrarán como:
Cust_no: 1 Nombre: Potter Apellido: Potter
Cust_no: 2 Nombre: Weasley Apellido: Weasley
Cust_no: 3 Nombre: Malfoy Apellido: Malfoy
Borrar datos (el Delete en curD)
Borrar una sola fila
sql = 'DELETE from cliente where cliente_no =9' cursor.execute(sql)
Borrar varias filas
#Borrar múltiples filas usando 'in':
id_list = [1,2,3] query_string = "delete from customer where customer_no in (%s)" % ','.join(['?'] * len(id_list)) cursor.execute(cadena_consulta, lista_id) Código completo para ODBC /JDBC
Importar pyodbc como 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("ELIMINANDO TABLA") cursor .execute("ELIMINAR TABLA SI EXISTE cliente") conn.commit print("nCREAR TABLA ") cursor .execute("CREAR TABLA customer(customer_no INT NOT NULL PRIMARY KEY,last_name VARCHAR(40),first_name CHAR(40))") print("INSERTAR FILAS A TABLA cliente") cursor.execute("INSERT INTO cliente VALUES (1, 'Harry', 'Potter')") cursor.execute("INSERT INTO cliente VALUES (2, 'Ron','Weasley')") cursor.execute("INSERT INTO cliente VALUES (3, 'Draco', 'Malfoy')") datos =[ (5, 'Harry', 'Potter'), (6, 'Ron','Weasley'), (7, 'Draco', 'Malfoy')] cursor.executemany("INSERT INTO cliente VALUES (?,?,?)",datos) #o datos =[ (8, 'A', ), (9, 'B',), (10, 'C', )] cursor.executemany("insert into cliente(nºcliente, nombre) VALUES(?, ?)", datos) print("ELIMINANDO TABLA") cursor.execute("ELIMINAR TABLA SI EXISTE test") print("CREAR TABLA para insertar muchas filas usando executemany()") cursor.execute("CREAR TABLA test(testid varchar(100))") datos_a_insertar = [(i,) for i in range(100)] print("Insertar varios datos en test") cursor.executemany("INSERT INTO test (testid) VALUES (?)", data_to_insert) print("Obtención del CONTADO DE LA TABLA") cursor.execute("select count(*) from customer") result=cursor.fetchone() print(resultado[0]) print("BUSCANDO MUCHAS FILAS") cursor.execute("select Primeros 3 * from cliente") resultados=cursor.fetchall() para fila en resultados: print ("Cust_no: ",row[0]," First Name: ",row[2]," Last Name: ",row[2]) print("ACTUALIZANDO UNA SOLA FILA") updatedata= ('X', 'Y', 10) sql = 'UPDATE cliente SET apellido = ? , first_name=? where customer_no =? ' cursor.execute(sql, updatedata) print("BORRAR UNA FILA") sql = 'DELETE from cliente where numero_cliente =9' cursor.execute(sql) print("BORRAR VARIAS FILAS UTILIZANDO 'IN'") id_list = [1,2,3] query_string = "delete from cliente where cliente_no in (%s)" % ','.join(['?'] * len(id_list)) cursor.execute(cadena_consulta, lista_id) #cerrar conexión cursor.close() conn.close()
Para JDBC código es el mismo sólo la cadena de conexión es diferente:
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')")
Referencias adicionales:
- Página del producto Actian Vector y guías
- pyodbc
- JayDeBeAPI
- Un ejemplo más detallado con Python, Vector e Ingres
Suscríbase al blog de Actian
Suscríbase al blog de Actian para recibir información sobre datos directamente en su correo electrónico.
- Manténgase informado: reciba lo último en análisis de datos directamente en su bandeja de entrada.
- No se pierda ni una publicación: recibirá actualizaciones automáticas por correo electrónico que le avisarán cuando se publiquen nuevas publicaciones.
- Todo depende de usted: cambie sus preferencias de entrega para adaptarlas a sus necesidades.