Escolar Documentos
Profissional Documentos
Cultura Documentos
Juliano Atanazio
About me
Juliano Atanazio
● Graduated in Computer Science for Business Management (Informática para Gestão de
Negócios), FATEC Zona Sul, São Paulo – SP;
● PostgreSQL DBA;
● Linux admin;
● Instructor (PostgreSQL);
● LPIC-1, LPIC-2 Certified;
● Linux user since 2000;
● Free Software enthusiast;
● Favorite technologies: PostgreSQL, Linux, Python, Shell Script, FreeBSD, etc...;
● Headbanger :) \m/
2/52
Sobre esta Apresentação
https://wulczer.org/pywaw-summit.pdf
3/52
Sobre Python
● Rica em bibliotecas;
● Propósitos gerais;
import this
www.python.org
4/52
Sobre PostgreSQL
● Extensível
www.postgresql.org
5/52
Stored Procedures no PostgreSQL
6/52
Stored Procedures no PostgreSQL
7/52
Funções: Sintaxe e Exemplos
BEGIN
RETURN 'Hello, World!';
END; $$ LANGUAGE PLPGSQL;
8/52
Funções: Sintaxe e Exemplos
BEGIN
RETURN (num1 + num2) * 2;
END; $$ LANGUAGE PLPGSQL;
9/52
Funções: Sintaxe e Exemplos
10/52
Funções: Sintaxe e Exemplos
11/52
Blocos Anônimos
Sintaxe:
DO $$
. . .
codigo
. . .
$$ LANGUAGE linguagem;
12/52
Blocos Anônimos
> DO $$
DECLARE n_con INT;
BEGIN
SELECT count(client_addr)
INTO n_con
FROM pg_stat_activity;
RAISE NOTICE
'Conexões não-locais: %', n_con;
END; $$ LANGUAGE PLPGSQL;
NOTICE: Conexões não-locais: 10
13/52
PL/Python
https://www.postgresql.org/docs/current/static/plpython.html
14/52
PL/Python
15/52
PL/Python: Tipos de Dados
PostgreSQL Python
bigint, integer, smallint int
numeric Decimal
boolean bool
array list
null None
16/52
PL/Python: O “U” da Questão
17/52
PL/Python vs PL/pgSQL
18/52
PL/Python vs PL/pgSQL
Variáveis Especiais para Triggers
19/52
PL/Python vs PL/pgSQL
Variáveis Especiais para Triggers
PL/pgSQL PL/Python Tipo Descrição
TG_TABLE_NAME / Nome da tabela que disparou o
TG_RELNAME TD['table_name']
(depreciado) gatilho.
name
TG_TABLE_SCHEMA TD['table_schema'] Nome do esquema (schema)
da tabela que disparou o gatilho.
Se o comando CREATE
TRIGGER inclui argumentos
para a função eles estão
array disponíveis de TD['args'][0] a
TG_ARGV[] TD['args'] De TD['args'][n - 1].
string Índices de array inválidos
(menor do que zero ou maior do
que TG_NARGS) resultam em
um valor nulo.
20/52
PL/Python vs PL/pgSQL
Variáveis Especiais para Triggers
21/52
PL/Python: Instalação
Nosso Laboratório
SO: CentOS Linux 7.5
Python: 3.6
PostgreSQL: 10
Diretório para bibliotecas Python : /var/lib/pgsql/python
PYTHONPATH: ${PYTHONPATH}:/var/lib/pgsql/python
22/52
PL/Python: Instalação
23/52
PL/Python: Instalação
24/52
PL/Python: Instalação
Para testar podemos iniciar o PostgreSQL passando o valor de
PYTHONPATH:
$ PYTHONPATH="${PYTHONPATH}:/var/lib/pgsql/python" \
pg_ctl start
25/52
PL/Python: Instalação
26/52
PL/Python: Exemplos
Criação da base de dados de exemplo:
> CREATE DATABASE db_plpython;
Conectar à base:
> \c db_plpython
27/52
PL/Python: Exemplos
$$ LANGUAGE PLPYTHON3U;
NOTICE: ['/var/lib/pgsql/python', '/usr/lib64/python36.zip',
'/usr/lib64/python3.6', '/usr/lib64/python3.6/lib-dynload', '/usr/
lib64/python3.6/site-packages', '/usr/lib/python3.6/site-
packages']
28/52
PL/Python: Exemplos
$$ LANGUAGE plpython3u;
29/52
PL/Python: Exemplos
Sobrecarga de função:
$$ LANGUAGE plpython3u;
30/52
PL/Python: Exemplos
31/52
PL/Python: Boas Práticas
● Mantenha seu código Python em um módulo;
● Faça todas suas funções SQL com apenas duas linhas;
● Teste o código Python fazendo mock [1].
[1] https://docs.python.org/3/library/unittest.mock.html
32/52
PL/Python: Boas Práticas
33/52
PL/Python: Boas Práticas
$$ LANGUAGE plpython3u;
34/52
PL/Python: Boas Práticas
Teste da função:
> SELECT 'Minha versão de Python é: '|| fc_py_version()
AS "Versão de Python";
Versão de Python
---------------------------------
Minha versão de Python é: 3.6.3s
35/52
PL/Python: Use Case
36/52
PL/Python: Use Case
37/52
PL/Python: Use Case
/var/lib/pgsql/python/MyFunctions.py
import json
import pprint
import xmltodict
Continua...
38/52
PL/Python: Use Case
/var/lib/pgsql/python/MyFunctions.py
def conv_xml_2_json(doc):
'Converte uma string XML para JSON'
doc = xmltodict.parse(doc)
return json.dumps(doc, ensure_ascii=False)
Continua...
39/52
PL/Python: Use Case
/var/lib/pgsql/python/MyFunctions.py
def pdf_extract_toc(f):
'Extrai o sumário de um PDF'
f = open(f, 'rb')
parser = PDFParser(f)
document = PDFDocument(parser)
outlines = document.get_outlines()
lista_tmp = []
for (level, title, dest, a, se) in outlines:
lista_tmp.append(title)
return '\n'.join(lista_tmp)
40/52
PL/Python: Use Case
$$ LANGUAGE PLPYTHON3U;
41/52
PL/Python: Use Case
Criação da tabela:
> CREATE TABLE tb_xml(
id serial PRIMARY KEY,
campo_xml xml);
42/52
PL/Python: Use Case
Inserir o registro:
> INSERT INTO tb_xml (campo_xml) VALUES (
'<receita nome="pão" tempo_de_preparo="5 minutos"
tempo_de_cozimento="1 hora">
<titulo>Pão simples</titulo>
<ingredientes>
<ingrediente quantidade="3"
unidade="xícaras">Farinha</ingrediente>
<ingrediente quantidade="7"
unidade="gramas">Fermento</ingrediente>
<ingrediente quantidade="1.5" unidade="xícaras"
estado="morna">Água</ingrediente>
<ingrediente quantidade="1" unidade="colheres de
chá">Sal</ingrediente>
</ingredientes>
<instrucoes>
<passo>Misture todos os ingredientes, e dissolva bem.</passo>
<passo>Cubra com um pano e deixe por uma hora em um local
morno.</passo>
<passo>Misture novamente, coloque numa bandeja e asse num
forno.</passo>
</instrucoes>
</receita>');
43/52
PL/Python: Use Case
44/52
PL/Python: Use Case
$$ LANGUAGE PLPYTHON3U;
45/52
PL/Python: Use Case
Criação da tabela:
> CREATE TABLE tb_apostila(
id serial PRIMARY KEY,
titulo VARCHAR(200),
autor VARCHAR(70),
toc text);
46/52
PL/Python: Use Case
Inserir um registro:
> INSERT INTO tb_apostila (titulo, autor, toc) VALUES (
'PostgreSQL - SQL Básico',
'Juliano Atanazio',
fc_py_pdf_extract_toc('/tmp/postgresql_sql_basico.pdf'));
47/52
PL/Python: Use Case
48/52
Conclusão
Utilize PL/Python para coisas
que PL/pgSQL não atende.
PL/Python por ser a
implementação de Python como
linguagem procedural no
PostgreSQL permite que se use
todo seu poder das “baterias
inclusas” além de pacotes de
bibliotecas extras instaladas via
pip, por exemplo.
49/52
Donate!
Contribute! :)
http://www.postgresql.org/about/donate/
50/52
Save our planet!
51/52
See you soon!!!
:)
Juliano Atanazio
juliano777@gmail.com
http://slideshare.net/spjuliano
https://speakerdeck.com/julianometalsp
https://juliano777.wordpress.com
52/52