programación en pl/python
TRANSCRIPT
EQ Soft Consultoría y Soporte E.I.R.L.Http://[email protected]éfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
Programando con Pl/PythonProgramando con Pl/Python
Ernesto Quiñones AzcárateErnesto Quiñones Azcá[email protected]@eqsoft.net
Pl/Python 1/30
EQ Soft Consultoría y Soporte E.I.R.L.Http://[email protected]éfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
¿Que es Pl/Python?¿Que es Pl/Python?
http://www.postgresql.org http://www.python.org
http://www.postgresql.org/docs/9.2/static/plpython.html
Pl/Python 2/30
EQ Soft Consultoría y Soporte E.I.R.L.Http://[email protected]éfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
¿Que es Pl/Python?¿Que es Pl/Python?
●Es un lenguaje para escribir funciones en PostgreSQL.
●Pero OjO ....... NO es un reemplazo a SQL o PL/SQL.
●Es una manera de extender la funcionalidad de PostgreSQL a labores que no se pueden llevar a cabo con Pl/PgSQL.
Pl/Python 3/30
EQ Soft Consultoría y Soporte E.I.R.L.Http://[email protected]éfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
¿Que no desde esperar de Pl/Python?¿Que no desde esperar de Pl/Python?
●Que sea más rápido para manipular data que Pl/PgSQL.
●Que puedas levantar todas las librerías habidas y por haber de Python para diversas labores, quizás la mayoría si pero no todas.
●Ahorrar recursos de procesamiento/ram en el servidor para tus funciones (procedimientos almacenados).
Pl/Python 4/30
EQ Soft Consultoría y Soporte E.I.R.L.Http://[email protected]éfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
Pl/Python 5/30
¿En que casos usar Pl/Python?¿En que casos usar Pl/Python?
●Cuando se requiera realizar labores extendidas en la base de datos, por ejemplo: mandar correos, realizar cálculos matemáticos avanzados, importar o generar datos formateados de forma extraña, etc.
●Cuando sabes programar en Python y no en Pl/Pgsql y no quieres aprender a programar en otro lenguaje.
EQ Soft Consultoría y Soporte E.I.R.L.Http://[email protected]éfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
Pl/Python 6/30
Conoce PythonConoce Python
EQ Soft Consultoría y Soporte E.I.R.L.Http://[email protected]éfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
Pl/Python 7/30
Conoce PythonConoce Python
Comandos básicos:
print “hola mundo” < imprime algo en la consola
A = 22 < crea la variable “A”
print A < imprime el valor almacenado en la variable “A”
b=input(“dame #:”) < solicita en la consola ingresar un valor y lo guarda en la variable “b”
EQ Soft Consultoría y Soporte E.I.R.L.Http://[email protected]éfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
Pl/Python 8/30
Conoce PythonConoce Python
(Los ... significan que debes presionar un “tab”)
a=3if a < 3:...print “es menor que 3”else:...print “es mayor o igual que 3”
presionar 2 veces “enter” en la ultima linmensaje:
EQ Soft Consultoría y Soporte E.I.R.L.Http://[email protected]éfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
Pl/Python 9/30
Conoce PythonConoce Python
Para programar en Python es mejor utilizar un editor de texto cualquiera o alguno especializado en este lenguaje, grabar el programa como un archivo de extensión “.py” (no obligatorio) y luego ejecutarlos así:
python holamundo.py
El resultado lo veremos en la consola del sistema operativo.
EQ Soft Consultoría y Soporte E.I.R.L.Http://[email protected]éfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
Pl/Python 10/30
Conoce PythonConoce PythonArreglos.
* Las “tuplas”, son conjuntos de datos como en una lista pero es inmutable, no se puede añadir o borrar elementos.
A='a',2,'c',4 for valor in A: ...print valor
Los elementos entre paréntesis denotan una tupla dentro de otra.
A='a',2,'c',4,('e',6) for valor in A: ...print valor
EQ Soft Consultoría y Soporte E.I.R.L.Http://[email protected]éfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
Pl/Python 11/30
Conoce PythonConoce PythonArreglos.
* Los “diccionarios” son como los arreglos tradicionales, tienen un índice y un valor como parte de su estructura, se puede añadir y quitar datos.
Arreglo={'a':123,'b':'holaprint Arreglo['b'] mundo',3:122}
ahora veamos que obtenemos con esto: for c in Arreglo: ...print c
Y ahora así: for c in Arreglo: ...print Arreglo[c]
EQ Soft Consultoría y Soporte E.I.R.L.Http://[email protected]éfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
Pl/Python 12/30
Conoce PythonConoce PythonEl manejo de cadenas en Python es bastante avanzado y no requiere funciones externas.
Concatenar: a='hola' a='aaa' b='mundo' a+='bbb' print a+' '+b print a
Subcadena (el indice siempre empieza en 0): a='hola mundo' print a[3] < un dígito print a[5:10] < una sección de cadena, como “substr” print a[5:] < desde la posición 5 hasta el final de la cadena
EQ Soft Consultoría y Soporte E.I.R.L.Http://[email protected]éfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
Pl/Python 13/30
Conoce PythonConoce PythonSubcadena (el indice siempre empieza en 0):
a='hola mundo'print a[:5] < corta desde el inicio hasta la posición 5print a[:5] < corta los últimos 5 caracteres de la cadenaprint a[2:5] < corta desde la posición 2 hasta los 5 Últimos caracteres de una cadena
Una manera de armar cadenas formateadas es así: X=12 Y=11 A=”el valor de X es: %d y de Y es:%d” % (X,Y) print A
Len, retorna la cantidad de caracteres de una cadena
EQ Soft Consultoría y Soporte E.I.R.L.Http://[email protected]éfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
Pl/Python 14/30
Conoce PythonConoce PythonEstructuras de control – WHILE:
X=10 Y=0 while Y < X: ...Y += 1 ...print Y
EQ Soft Consultoría y Soporte E.I.R.L.Http://[email protected]éfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
Pl/Python 15/30
Conoce PythonConoce PythonEstructuras de control – FOR:
for a in range(1,10): < ejecuta del 1 al 9...print a
for a in range(10): < ejecuta del 0 al 9...print a
En una lista de valores:for a in (1,10,5,7): < puede ser una tupla o un ..print a diccionario
EQ Soft Consultoría y Soporte E.I.R.L.Http://[email protected]éfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
Pl/Python 16/30
Conoce PythonConoce PythonEstructuras de control – FOR:
En un rango de números :for a in range(1,10,2): <ejecuta del 1 al 9...print a saltando de 2 en 2
for a in range(10,1,3): <ejecuta del 10 al 1...print a saltando de 3 en 3
for a,b in ((1,4),(2,5),(3,6)): < solo se acepta...print a valores...print b numéricos enteros
EQ Soft Consultoría y Soporte E.I.R.L.Http://[email protected]éfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
Pl/Python 17/30
Conoce PythonConoce PythonEstructuras de control Break:Permite salir de un loop for c in range(1,10): < ejecuta del 1 al 6 ...print c ...if c > 5: ......break
Estructuras de control Continue:Permite volver a iterar sin ejecutar el código que continua en el loop for c in range(1,10): < ejecuta del 1 al 5 ...if c > 5: ......continue ...print c
EQ Soft Consultoría y Soporte E.I.R.L.Http://[email protected]éfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
Pl/Python 18/30
Conoce PythonConoce Python
CHEVERE!!!!!
YA SABES PYTHON
Ahora hagamoslo conversar con PostgreSQL
EQ Soft Consultoría y Soporte E.I.R.L.Http://[email protected]éfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
Pl/Python 19/30
Pl/PythonPl/Python
Instalando:
Debian, Ubuntu y otros:apt-get install postgresql-plpython-9.1
Centos, Redhat, Fedora y otros:yum install
EQ Soft Consultoría y Soporte E.I.R.L.Http://[email protected]éfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
Pl/Python 20/30
Pl/PythonPl/Python
Instalamos el Pl/Python:sudo aptget install postgresqlplpython9.1
Creamos una DB parta trabajar:createdb dbpython0 U USER_ADMIN_NAME
Instalamos el lenguaje en la DB:createlang plpythonu python0 U USER_ADMIN_NAME
EQ Soft Consultoría y Soporte E.I.R.L.Http://[email protected]éfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
Pl/Python 21/30
Pl/PythonPl/Python
Instalamos el Pl/Python:sudo aptget install postgresqlplpython9.1
Creamos una DB parta trabajar:createdb dbpython0 U USER_ADMIN_NAME
Instalamos el lenguaje en la DB:createlang plpythonu python0 U USER_ADMIN_NAME
EQ Soft Consultoría y Soporte E.I.R.L.Http://[email protected]éfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
Pl/Python 22/30
Pl/PythonPl/Python
Ahora a probarlo, en un editor de texto escriba esto y lo grabamos como “ejemplo1.plpy” :CREATE FUNCTION py_fecha () RETURNS integerAS $$ import os os.system("date >> /[RUTA]/fecha.txt") return 1$$ LANGUAGE plpythonu;
Creamos en /[RUTA] el file “fecha.txt” con:touch fecha.txtChmod 777 fecha.txt < le damos todos los accesos
EQ Soft Consultoría y Soporte E.I.R.L.Http://[email protected]éfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
Pl/Python 23/30
Pl/PythonPl/Python
Importamos nuestro script en la db:[root@hostname]psql python0 U USER_NAMEpython0=#\i /[RUTA]/ejemplo1.plpy
Ejecutar la función creada:python0=# select py_fecha(); py_fecha 1
Verificamos que paso (en consola):[root@hostname]cat /[ruta]/fecha.txt
EQ Soft Consultoría y Soporte E.I.R.L.Http://[email protected]éfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
Pl/Python 24/30
Pl/PythonPl/Python
Vamos a enviar un email.
Para ciertas funciones necesitamos instalar algunas librerias adicionales de Python, en este caso usaremos una llamada “smtplib” que ya viene instalada por defecto.
Vamos a instalar un servidor de correos simple: sudo aptget install exim4
El log del server podemos verlo así: sudo tail f /var/log/exim4/mainlog
EQ Soft Consultoría y Soporte E.I.R.L.Http://[email protected]éfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
Pl/Python 25/30
Pl/PythonPl/Python
Esta es nuestra función para enviar emails:
CREATE FUNCTION py_mail () RETURNS integerAS $$ import smtplib to="[email protected]" sender="[email protected]" smtpserver = smtplib.SMTP("localhost") smtpserver.ehlo() smtpserver.ehlo header = 'To:' + to + '\n' + 'From: '+ sender + '\n' + 'Subject:test\n' msg = header + '\n Mensaje de prueba \n\n' smtpserver.sendmail(sender, to, msg) smtpserver.close() return 1$$ LANGUAGE plpythonu;
EQ Soft Consultoría y Soporte E.I.R.L.Http://[email protected]éfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
Pl/Python 26/30
Pl/PythonPl/Python
Ejecutamos la función y verificamos el log del EXIM4 para ver si llego el email.
Algo así se verá:
2012-10-10 23:00:25 1TM9wf-0004nf-0o <= [email protected] H=localhost ([127.0.1.1]) [127.0.0.1] P=esmtp S=3812012-10-10 23:00:25 1TM9wf-0004nf-0o ** [email protected] R=nonlocal: Mailing to remote domains not supported2012-10-10 23:00:25 1TM9wf-0004nh-In <= <> R=1TM9wf-0004nf-0o U=Debian-exim P=local S=12012012-10-10 23:00:25 1TM9wf-0004nf-0o Completed2012-10-10 23:00:25 1TM9wf-0004nh-In ** [email protected] R=nonlocal: Mailing to remote domains not supported2012-10-10 23:00:25 1TM9wf-0004nh-In Frozen (delivery error message)
EQ Soft Consultoría y Soporte E.I.R.L.Http://[email protected]éfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
Pl/Python 27/30
Pl/PythonPl/Python
Ahora vamos a manipular datos.
Pl/Python requiere instalar la libreria de PostgreSQL para Python (¿primer choque emocional?)
sudo aptget install pythonpygresql
Vamos a crear una tablita:
python0=# create table datos( numero int, texto char(10)); CREATE TABLE python0=# insert into datos values (1,'A'), ('2','B'), (3,'C'); INSERT 0 3
EQ Soft Consultoría y Soporte E.I.R.L.Http://[email protected]éfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
Pl/Python 28/30
Pl/PythonPl/Python
Escribimos el siguiente script:
CREATE FUNCTION py_data ( registro integer, valor char) RETURNS integerAS $$ import pg
dbPG= pg.connect(dbname='python0',user='dbadmin',passwd='dbadmin',host='localhost')
qry = "update datos set texto = '" + valor + "' where numero = " + str(registro)
resultado = dbPG.query(qry) return 1$$ LANGUAGE plpythonu;
EQ Soft Consultoría y Soporte E.I.R.L.Http://[email protected]éfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
Pl/Python 29/30
Pl/PythonPl/Python
Lo subimos y los ejecutamos:
python0=# \i /home/ernesto/plpython/ejemplo3.pyCREATE FUNCTION
python0=# select py_data(1,'BB'); py_data 1
python0=# select * from datos; numero | texto + 2 | B 3 | C 1 | BB
EQ Soft Consultoría y Soporte E.I.R.L.Http://[email protected]éfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
Pl/Python 30/30
Pl/PythonPl/Python
ESO ES TODO
GRACIAS