3. ¿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.
EQ Soft Consultoría y Soporte E.I.R.L. Pl/Python
Http://www.eqsoft.net 3/30
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
4. ¿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).
EQ Soft Consultoría y Soporte E.I.R.L. Pl/Python
Http://www.eqsoft.net 4/30
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
5. ¿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. Pl/Python
Http://www.eqsoft.net 5/30
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
7. Conoce 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. Pl/Python
Http://www.eqsoft.net 7/30
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
8. Conoce Python
(Los ... significan que debes presionar un “tab”)
a=3
if 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. Pl/Python
Http://www.eqsoft.net 8/30
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
9. Conoce 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. Pl/Python
Http://www.eqsoft.net 9/30
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
10. Conoce Python
Arreglos.
* 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. Pl/Python
Http://www.eqsoft.net 10/30
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
11. Conoce Python
Arreglos.
* 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. Pl/Python
Http://www.eqsoft.net 11/30
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
12. Conoce Python
El 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. Pl/Python
Http://www.eqsoft.net 12/30
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
13. Conoce Python
Subcadena (el indice siempre empieza en 0):
a='hola mundo'
print a[:5] < corta desde el inicio hasta la posición 5
print a[:5] < corta los últimos 5 caracteres de la cadena
print 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. Pl/Python
Http://www.eqsoft.net 13/30
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
14. Conoce Python
Estructuras de control – WHILE:
X=10
Y=0
while Y < X:
...Y += 1
...print Y
EQ Soft Consultoría y Soporte E.I.R.L. Pl/Python
Http://www.eqsoft.net 14/30
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
15. Conoce Python
Estructuras 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. Pl/Python
Http://www.eqsoft.net 15/30
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
16. Conoce Python
Estructuras 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. Pl/Python
Http://www.eqsoft.net 16/30
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
17. Conoce Python
Estructuras 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. Pl/Python
Http://www.eqsoft.net 17/30
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
20. Pl/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. Pl/Python
Http://www.eqsoft.net 20/30
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
21. Pl/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. Pl/Python
Http://www.eqsoft.net 21/30
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
22. Pl/Python
Ahora a probarlo, en un editor de texto escriba
esto y lo grabamos como “ejemplo1.plpy” :
CREATE FUNCTION py_fecha ()
RETURNS integer
AS $$
import os
os.system("date >> /[RUTA]/fecha.txt")
return 1
$$ LANGUAGE plpythonu;
Creamos en /[RUTA] el file “fecha.txt” con:
touch fecha.txt
Chmod 777 fecha.txt < le damos todos los accesos
EQ Soft Consultoría y Soporte E.I.R.L. Pl/Python
Http://www.eqsoft.net 22/30
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
23. Pl/Python
Importamos nuestro script en la db:
[root@hostname]psql python0 U USER_NAME
python0=#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. Pl/Python
Http://www.eqsoft.net 23/30
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
24. Pl/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. Pl/Python
Http://www.eqsoft.net 24/30
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
25. Pl/Python
Esta es nuestra función para enviar emails:
CREATE FUNCTION py_mail ()
RETURNS integer
AS $$
import smtplib
to="el_que_recibe@mail.com"
sender="el_que_envia@mail.com"
smtpserver = smtplib.SMTP("localhost")
smtpserver.ehlo()
smtpserver.ehlo
header = 'To:' + to + 'n' + 'From: '+ sender + 'n' + 'Subject:testn'
msg = header + 'n Mensaje de prueba nn'
smtpserver.sendmail(sender, to, msg)
smtpserver.close()
return 1
$$ LANGUAGE plpythonu;
EQ Soft Consultoría y Soporte E.I.R.L. Pl/Python
Http://www.eqsoft.net 25/30
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
26. Pl/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 <= el_que_envia@mail.com
H=localhost ([127.0.1.1]) [127.0.0.1] P=esmtp S=381
2012-10-10 23:00:25 1TM9wf-0004nf-0o ** el_que_recibe@mail.com R=nonlocal:
Mailing to remote domains not supported
2012-10-10 23:00:25 1TM9wf-0004nh-In <= <> R=1TM9wf-0004nf-0o
U=Debian-exim P=local S=1201
2012-10-10 23:00:25 1TM9wf-0004nf-0o Completed
2012-10-10 23:00:25 1TM9wf-0004nh-In ** el_que_envia@mail.com R=nonlocal:
Mailing to remote domains not supported
2012-10-10 23:00:25 1TM9wf-0004nh-In Frozen (delivery error message)
EQ Soft Consultoría y Soporte E.I.R.L. Pl/Python
Http://www.eqsoft.net 26/30
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
27. Pl/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. Pl/Python
Http://www.eqsoft.net 27/30
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
28. Pl/Python
Escribimos el siguiente script:
CREATE FUNCTION py_data ( registro integer, valor char)
RETURNS integer
AS $$
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. Pl/Python
Http://www.eqsoft.net 28/30
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
29. Pl/Python
Lo subimos y los ejecutamos:
python0=# i /home/ernesto/plpython/ejemplo3.py
CREATE 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. Pl/Python
Http://www.eqsoft.net 29/30
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
30. Pl/Python
ESO ES TODO
GRACIAS
EQ Soft Consultoría y Soporte E.I.R.L. Pl/Python
Http://www.eqsoft.net 30/30
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957