PDF de programación - Python dentro de Postres con PL/Python

Imágen de pdf Python dentro de Postres con PL/Python

Python dentro de Postres con PL/Pythongráfica de visualizaciones

Publicado el 6 de Abril del 2018
618 visualizaciones desde el 6 de Abril del 2018
263,7 KB
24 paginas
Creado hace 12a (06/10/2011)
Python dentro de Postgres 
Python dentro de Postgres 

con PL/Python
con PL/Python

PGDAY Ecuador 2011
PUCE – Quito
Milton Labanda
Octubre 2011



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



Stored Procedures: funciones en Postgres

 Varias alternativas para escribir funciones

almacenadas en Postgres :
• PL/PgSql
• PL/TCL
• PL/Java
• PL/Perl
• PL/Python



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



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

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

 Las funciones pueden comunicarse fuera de la

crear funciones

Base de Datos



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:
• 2) desde fuera

• bd=# CREATE LANGUAGE plpythonu;

• $ createlang plpythonu nombre_bd



Sintaxis para crear funciones

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



Una primera función

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



Una primera función: resultados

SELECT potenciapy(2,4)

potencia
- - - - - - -
16



Mapeo de Tipos de Datos

PostgreSQL

boolean
Smallint, int
Real, double, numeric
otros
arrays
Composite Types

Composite Types

Python

NOTA

bool
int
float
str
listas
diccionarios

tuplas, listas, diccionarios,
objectos de clases Python

Como
parámetros
Como valores de
retorno



Tipos Compuestos: tipo Postgres

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



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;



Tipos Compuestos: acción...

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



setof: Múltiples resultados

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



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



Una BD para los ejemplos que siguen



plpy: Acceso a Bases de Datos

plpy

 El módulo plpy contiene dos métodos:

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

• plpy.execute(consulta,limite)
• plpy.prepare(consulta,tipos)
python

 Los resultados emulan listas o diccionarios de



plpy: Acceso a Bases de Datos

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



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'}



DO: Bloques de Código Anónimos

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



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;



Triggers y plpython: el disparador

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



Triggers y plpython: acción...

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

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



Preguntas?
  • Links de descarga
http://lwp-l.com/pdf10231

Comentarios de: Python dentro de Postres con PL/Python (0)


No hay comentarios
 

Comentar...

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios...
CerrarCerrar
CerrarCerrar
Cerrar

Tienes que ser un usuario registrado para poder insertar imágenes, archivos y/o videos.

Puedes registrarte o validarte desde aquí.

Codigo
Negrita
Subrayado
Tachado
Cursiva
Insertar enlace
Imagen externa
Emoticon
Tabular
Centrar
Titulo
Linea
Disminuir
Aumentar
Vista preliminar
sonreir
dientes
lengua
guiño
enfadado
confundido
llorar
avergonzado
sorprendido
triste
sol
estrella
jarra
camara
taza de cafe
email
beso
bombilla
amor
mal
bien
Es necesario revisar y aceptar las políticas de privacidad