Download Que es Pl/Python?

Document related concepts
no text concepts found
Transcript
Programando con Pl/Python
Ernesto Quiñones Azcárate
[email protected]
EQ Soft Consultoría y Soporte E.I.R.L.
Http://www.eqsoft.net
[email protected]
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
Pl/Python
1/30
¿Que es Pl/Python?
http://www.postgresql.org
http://www.python.org
http://www.postgresql.org/docs/9.2/static/plpython.html
EQ Soft Consultoría y Soporte E.I.R.L.
Http://www.eqsoft.net
[email protected]
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
Pl/Python
2/30
¿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.
Http://www.eqsoft.net
[email protected]
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
Pl/Python
3/30
¿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.
Http://www.eqsoft.net
[email protected]
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
Pl/Python
4/30
¿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://www.eqsoft.net
[email protected]
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
Pl/Python
5/30
Conoce Python
EQ Soft Consultoría y Soporte E.I.R.L.
Http://www.eqsoft.net
[email protected]
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
Pl/Python
6/30
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.
Http://www.eqsoft.net
[email protected]
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
Pl/Python
7/30
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.
Http://www.eqsoft.net
[email protected]
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
Pl/Python
8/30
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.
Http://www.eqsoft.net
[email protected]
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
Pl/Python
9/30
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.
Http://www.eqsoft.net
[email protected]
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
Pl/Python
10/30
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.
Http://www.eqsoft.net
[email protected]
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
Pl/Python
11/30
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.
Http://www.eqsoft.net
[email protected]
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
Pl/Python
12/30
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.
Http://www.eqsoft.net
[email protected]
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
Pl/Python
13/30
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.
Http://www.eqsoft.net
[email protected]
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
Pl/Python
14/30
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.
Http://www.eqsoft.net
[email protected]
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
Pl/Python
15/30
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.
Http://www.eqsoft.net
[email protected]
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
Pl/Python
16/30
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.
Http://www.eqsoft.net
[email protected]
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
Pl/Python
17/30
Conoce Python
CHEVERE!!!!!
YA SABES PYTHON
Ahora hagamoslo conversar con
PostgreSQL
EQ Soft Consultoría y Soporte E.I.R.L.
Http://www.eqsoft.net
[email protected]
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
Pl/Python
18/30
Pl/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://www.eqsoft.net
[email protected]
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
Pl/Python
19/30
Pl/Python
Instalamos el Pl/Python:
sudo apt­get install postgresql­plpython­9.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://www.eqsoft.net
[email protected]
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
Pl/Python
20/30
Pl/Python
Instalamos el Pl/Python:
sudo apt­get install postgresql­plpython­9.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://www.eqsoft.net
[email protected]
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
Pl/Python
21/30
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.
Http://www.eqsoft.net
[email protected]
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
Pl/Python
22/30
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.
Http://www.eqsoft.net
[email protected]
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
Pl/Python
23/30
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 apt­get 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://www.eqsoft.net
[email protected]
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
Pl/Python
24/30
Pl/Python
Esta es nuestra función para enviar e­mails:
CREATE FUNCTION py_mail ()
RETURNS integer
AS $$
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://www.eqsoft.net
[email protected]
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
Pl/Python
25/30
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 <= [email protected]
H=localhost ([127.0.1.1]) [127.0.0.1] P=esmtp S=381
2012-10-10 23:00:25 1TM9wf-0004nf-0o ** [email protected] 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 ** [email protected] 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.
Http://www.eqsoft.net
[email protected]
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
Pl/Python
26/30
Pl/Python
Ahora vamos a manipular datos.
Pl/Python requiere instalar la libreria de PostgreSQL para
Python (¿primer choque emocional?)
sudo apt­get install python­pygresql
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://www.eqsoft.net
[email protected]
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
Pl/Python
27/30
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.
Http://www.eqsoft.net
[email protected]
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
Pl/Python
28/30
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.
Http://www.eqsoft.net
[email protected]
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
Pl/Python
29/30
Pl/Python
ESO ES TODO
GRACIAS
EQ Soft Consultoría y Soporte E.I.R.L.
Http://www.eqsoft.net
[email protected]
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
Pl/Python
30/30