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 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://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 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://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 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://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 emails: 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 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://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