24
Python dentro de Postgres Python dentro de Postgres con PL/Python con PL/Python PGDAY Ecuador 2011 PUCE – Quito Milton Labanda Octubre 2011

Python dentro de Postgres con PL/Python - … · Stored Procedures: funciones en Postgres Varias alternativas para escribir funciones almacenadas en Postgres :

  • Upload
    lynga

  • View
    275

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Python dentro de Postgres con PL/Python - … · Stored Procedures: funciones en Postgres Varias alternativas para escribir funciones almacenadas en Postgres :

Python dentro de Postgres Python dentro de Postgres con PL/Pythoncon PL/Python

PGDAY Ecuador 2011PUCE – QuitoMilton LabandaOctubre 2011

Page 2: Python dentro de Postgres con PL/Python - … · Stored Procedures: funciones en Postgres Varias alternativas para escribir funciones almacenadas en Postgres :

Stored Procedures

Funciones o procedimientos persistentes dentro de la Base de Datos

Se necesita un Lenguaje Procedural (PL) : Un binding o una pasarela hacia el entorno real de ejecución del lenguaje escogido

Se puede usar todas las posibilidades del lenguaje escogido en el procedimiento almacenado

Muy útiles para extender las posibilidades de nuestra Base de Datos

Page 3: Python dentro de Postgres con PL/Python - … · Stored Procedures: funciones en Postgres Varias alternativas para escribir funciones almacenadas en Postgres :

Stored Procedures: funciones en Postgres

Varias alternativas para escribir funciones almacenadas en Postgres :• PL/PgSql

• PL/TCL

• PL/Java

• PL/Perl

• PL/Python

Page 4: Python dentro de Postgres con PL/Python - … · Stored Procedures: funciones en Postgres Varias alternativas para escribir funciones almacenadas en Postgres :

Por qué Python?

Fácil de Leer, fácil de aprender, fácil de usar Poderoso y rápido Disponible en casi todas las distribuciones

GNU/Linux, también hay para Window$ Cientos de módulos estándar y de terceros Ej: Gnome, OpenERP, Google, Yahoo, PDVSA ... Un futuro muy prometedor

Page 5: Python dentro de Postgres con PL/Python - … · Stored Procedures: funciones en Postgres Varias alternativas para escribir funciones almacenadas en Postgres :

plpythonu: Por qué la 'u' de untrusted?

PL/Python es un lenguage UNTRUSTED Sólo los superusuarios de la Base de Datos pueden

crear funciones Las funciones pueden comunicarse fuera de la

Base de Datos

Page 6: Python dentro de Postgres con PL/Python - … · Stored Procedures: funciones en Postgres Varias alternativas para escribir funciones almacenadas en Postgres :

Requerimientos

Instalar PostgreSQL Instalar Python Instalar postgresql-python:

• apt-get install postgresql-python (en debian) Habilitar PL/Python en la Base de Datos:

• 1) desde dentro:• bd=# CREATE LANGUAGE plpythonu;

• 2) desde fuera• $ createlang plpythonu nombre_bd

Page 7: Python dentro de Postgres con PL/Python - … · Stored Procedures: funciones en Postgres Varias alternativas para escribir funciones almacenadas en Postgres :

Sintaxis para crear funciones

CREATE FUNCTION nombre_funcion (....) AS $$ ...código python... $$ LANGUAGE plpythonu;

Page 8: Python dentro de Postgres con PL/Python - … · Stored Procedures: funciones en Postgres Varias alternativas para escribir funciones almacenadas en Postgres :

Una primera función

CREATE OR REPLACE FUNCTION potenciapy(base float, exponente float) RETURNS float AS $$ p = base ** exponente return p$$ LANGUAGE 'plpythonu' VOLATILE;

Page 9: Python dentro de Postgres con PL/Python - … · Stored Procedures: funciones en Postgres Varias alternativas para escribir funciones almacenadas en Postgres :

Una primera función: resultados

SELECT potenciapy(2,4)

potencia - - - - - - - 16

Page 10: Python dentro de Postgres con PL/Python - … · Stored Procedures: funciones en Postgres Varias alternativas para escribir funciones almacenadas en Postgres :

Mapeo de Tipos de Datos

PostgreSQL Python NOTA

boolean bool

Smallint, int int

Real, double, numeric float

otros str

arrays listas

Composite Types diccionarios Como parámetros

Composite Types tuplas, listas, diccionarios, objectos de clases Python

Como valores de retorno

Page 11: Python dentro de Postgres con PL/Python - … · Stored Procedures: funciones en Postgres Varias alternativas para escribir funciones almacenadas en Postgres :

Tipos Compuestos: tipo Postgres

CREATE TYPE persona AS ( nombre TEXT, apellido TEXT );

Page 12: Python dentro de Postgres con PL/Python - … · Stored Procedures: funciones en Postgres Varias alternativas para escribir funciones almacenadas en Postgres :

Tipos Compuestos: clase Python

CREATE FUNCTION crear_persona (nombre TEXT, apellido TEXT) RETURNS persona AS $$ class Persona: def __init__ (self, n, a): self.nombre = n self.apellido = a return Persona(nombre, apellido)$$ LANGUAGE plpythonu;

Page 13: Python dentro de Postgres con PL/Python - … · Stored Procedures: funciones en Postgres Varias alternativas para escribir funciones almacenadas en Postgres :

Tipos Compuestos: acción...

db=# SELECT crear_persona('Guido', 'van Rossum'); crear_persona ---------------------- (Guido,"van Rossum")

Page 14: Python dentro de Postgres con PL/Python - … · Stored Procedures: funciones en Postgres Varias alternativas para escribir funciones almacenadas en Postgres :

setof: Múltiples resultados

create or replace function pydir(dir text) returns setof textas $$ import os return os.listdir(dir)$$ language 'plpythonu';

Page 15: Python dentro de Postgres con PL/Python - … · Stored Procedures: funciones en Postgres Varias alternativas para escribir funciones almacenadas en Postgres :

setof: Múltiples resultados

db=# select pydir('/etc/postgresql/9.0/main'); pydir ----------------- pg_ident.conf start.conf environment pg_hba.conf pg_ctl.conf postgresql.conf

Page 16: Python dentro de Postgres con PL/Python - … · Stored Procedures: funciones en Postgres Varias alternativas para escribir funciones almacenadas en Postgres :

Una BD para los ejemplos que siguen

Page 17: Python dentro de Postgres con PL/Python - … · Stored Procedures: funciones en Postgres Varias alternativas para escribir funciones almacenadas en Postgres :

plpy: Acceso a Bases de Datos

PL/Python importa automáticamente el módulo plpy

El módulo plpy contiene dos métodos:• plpy.execute(consulta,limite)

• plpy.prepare(consulta,tipos) Los resultados emulan listas o diccionarios de

python

Page 18: Python dentro de Postgres con PL/Python - … · Stored Procedures: funciones en Postgres Varias alternativas para escribir funciones almacenadas en Postgres :

plpy: Acceso a Bases de Datos

create or replace function json(query text) returns setof textas $$ rs = plpy.execute(query) # devuelve una lista de diccionarios return rs$$ language 'plpythonu';

Page 19: Python dentro de Postgres con PL/Python - … · Stored Procedures: funciones en Postgres Varias alternativas para escribir funciones almacenadas en Postgres :

plpy: Acceso a Bases de Datos

db=# select json('select titulo,hora from conferencias order by hora');

json------------------------------------------------------- {'hora': '13:30:00', 'titulo': 'Pl/Python'} {'hora': '14:15:00', 'titulo': 'PostGIS'} {'hora': '15:00:00', 'titulo': 'noSQL en PostgreSQL'}

Page 20: Python dentro de Postgres con PL/Python - … · Stored Procedures: funciones en Postgres Varias alternativas para escribir funciones almacenadas en Postgres :

DO: Bloques de Código Anónimos

db=# do $$import osdir = os.getcwd()plpy.info('El directorio actual es %s' % dir)$$ LANGUAGE plpythonu;INFO: El directorio actual es /home/miltonlabCONTEXTO: PL/Python anonymous code blockDO

Page 21: Python dentro de Postgres con PL/Python - … · Stored Procedures: funciones en Postgres Varias alternativas para escribir funciones almacenadas en Postgres :

Triggers y plpython: La función

create function pyaudit() returns trigger as $$ import datetime t = datetime.datetime.now().__str__() d = (t,TD['table_name'],TD['event'],TD['when']) s = '%s tabla: %s evento: %s momento: %s' % d f = open('/tmp/pypglog.txt','a') f.write(tex+'\n') f.close()$$ language plpythonu;

Page 22: Python dentro de Postgres con PL/Python - … · Stored Procedures: funciones en Postgres Varias alternativas para escribir funciones almacenadas en Postgres :

Triggers y plpython: el disparador

CREATE TRIGGER tr_confs BEFORE INSERT OR UPDATE OR DELETE ON conferencias FOR EACH ROW EXECUTE PROCEDURE pyaudit();

Page 23: Python dentro de Postgres con PL/Python - … · Stored Procedures: funciones en Postgres Varias alternativas para escribir funciones almacenadas en Postgres :

Triggers y plpython: acción...

db=# insert into conferencias values ( 4,'Colas con PgQ','10:45','Skytools');

$less /tmp/pypglog.txt2011-10-02 08:12:05.115315 tabla: conferencias evento: INSERT momento: BEFORE2011-10-02 08:14:40.928435 tabla: conferencias evento: INSERT momento: BEFORE

Page 24: Python dentro de Postgres con PL/Python - … · Stored Procedures: funciones en Postgres Varias alternativas para escribir funciones almacenadas en Postgres :

Preguntas?