Ce diaporama a bien été signalé.
Nous utilisons votre profil LinkedIn et vos données d’activité pour vous proposer des publicités personnalisées et pertinentes. Vous pouvez changer vos préférences de publicités à tout moment.

Falando "Postgrês"

116 vues

Publié le

Palestra ministrada no 22° PythonFloripa Meetup (https://youtu.be/tB0uNqjwbX8?t=7h14m57s) demonstrando as funcionalidades do Postgres, integrações com Python e algumas curiosidades

Publié dans : Logiciels
  • DOWNLOAD THAT BOOKS INTO AVAILABLE FORMAT (2019 Update) ......................................................................................................................... ......................................................................................................................... Download Full PDF EBOOK here { http://bit.ly/2m6jJ5M } ......................................................................................................................... Download Full EPUB Ebook here { http://bit.ly/2m6jJ5M } ......................................................................................................................... Download Full doc Ebook here { http://bit.ly/2m6jJ5M } ......................................................................................................................... Download PDF EBOOK here { http://bit.ly/2m6jJ5M } ......................................................................................................................... Download EPUB Ebook here { http://bit.ly/2m6jJ5M } ......................................................................................................................... Download doc Ebook here { http://bit.ly/2m6jJ5M } ......................................................................................................................... ......................................................................................................................... ................................................................................................................................... eBook is an electronic version of a traditional print book that can be read by using a personal computer or by using an eBook reader. (An eBook reader can be a software application for use on a computer such as Microsoft's free Reader application, or a book-sized computer that is used solely as a reading device such as Nuvomedia's Rocket eBook.) Users can purchase an eBook on diskette or CD, but the most popular method of getting an eBook is to purchase a downloadable file of the eBook (or other reading material) from a Web site (such as Barnes and Noble) to be read from the user's computer or reading device. Generally, an eBook can be downloaded in five minutes or less ......................................................................................................................... .............. Browse by Genre Available eBooks .............................................................................................................................. Art, Biography, Business, Chick Lit, Children's, Christian, Classics, Comics, Contemporary, Cookbooks, Manga, Memoir, Music, Mystery, Non Fiction, Paranormal, Philosophy, Poetry, Psychology, Religion, Romance, Science, Science Fiction, Self Help, Suspense, Spirituality, Sports, Thriller, Travel, Young Adult, Crime, Ebooks, Fantasy, Fiction, Graphic Novels, Historical Fiction, History, Horror, Humor And Comedy, ......................................................................................................................... ......................................................................................................................... .....BEST SELLER FOR EBOOK RECOMMEND............................................................. ......................................................................................................................... Blowout: Corrupted Democracy, Rogue State Russia, and the Richest, Most Destructive Industry on Earth,-- The Ride of a Lifetime: Lessons Learned from 15 Years as CEO of the Walt Disney Company,-- Call Sign Chaos: Learning to Lead,-- StrengthsFinder 2.0,-- Stillness Is the Key,-- She Said: Breaking the Sexual Harassment Story That Helped Ignite a Movement,-- Atomic Habits: An Easy & Proven Way to Build Good Habits & Break Bad Ones,-- Everything Is Figureoutable,-- What It Takes: Lessons in the Pursuit of Excellence,-- Rich Dad Poor Dad: What the Rich Teach Their Kids About Money That the Poor and Middle Class Do Not!,-- The Total Money Makeover: Classic Edition: A Proven Plan for Financial Fitness,-- Shut Up and Listen!: Hard Business Truths that Will Help You Succeed, ......................................................................................................................... .........................................................................................................................
       Répondre 
    Voulez-vous vraiment ?  Oui  Non
    Votre message apparaîtra ici
  • (Unlimited)....ACCESS WEBSITE Over for All Ebooks ................ accessibility Books Library allowing access to top content, including thousands of title from favorite author, plus the ability to read or download a huge selection of books for your pc or smartphone within minutes ......................................................................................................................... DOWNLOAD FULL PDF EBOOK here { http://bit.ly/2m6jJ5M } ......................................................................................................................... Download Full EPUB Ebook here { http://bit.ly/2m6jJ5M } ......................................................................................................................... Download Full PDF EBOOK here { http://bit.ly/2m6jJ5M }
       Répondre 
    Voulez-vous vraiment ?  Oui  Non
    Votre message apparaîtra ici
  • Soyez le premier à aimer ceci

Falando "Postgrês"

  1. 1. FALANDO "POSTGRÊS" DICKSON S. GUEDES 22° PYTHONFLORIPA MEETUP https://youtu.be/tB0uNqjwbX8?t=7h14m57s
  2. 2. BEGIN TRANSACTION; Por que estamos aqui hoje?
  3. 3. AVISO IMPORTANTE Esta palestra conterá cenas fortes de assassinato às boas práticas de códigos. Também conterá códigos que provocarão os mais diferentes estímulos musculares em sua face. `(leia-se "sua face" mesmo, e não "seu feice") Existe o risco de que alguns paradigmas seus sejam quebrados. Você pode querer começar a se retirar… tudo bem…
  4. 4. EMACS ROCKS! Esta palestra é totalmente escrita e apresentada utilizando o editor de texto Emacs com org-mode `(leia-se "não vai ter memes") e este talvez seja o primeiro paradigma a ser quebrado… Além de uma tela preta e apresentação em texto você verá códigos em Python e em SQL sendo reproduzidos aqui dentro mesmo… PS: ainda dá tempo de sair…
  5. 5. SEM MEMES?
  6. 6. VAMOS ENTÃO COMEÇAR? A language that doesn't affect the way you think about programming, is not worth knowing. - Alan Perlis Então vamos conhecer um pouco mais das relações entre o Python e o Elefante?
  7. 7. LICENÇA
  8. 8. PYTHON GPL Compatível
  9. 9. POSTGRESQL PostgreSQL License
  10. 10. PADRÕES
  11. 11. PEP 1-8: Guidelines, Code Style, … 20: The Zen of Python 248: Database API Spec v1.0 249: Database API Spec v2.0 257: Docstring
  12. 12. SQL (ISO/IEC) 92: CLI, PSM, DATETIME, UNION, …, INFORMATION_SCHEMA, CAST, … 1999: MED, OLB, JRT, GROUP BY, ROLLUP, WITH RECURSIVE 2003: XML, Window Functions, SEQUENCES, MERGE* 2006: XML, XQuery 2008: TRUNCATE, Partitioned JOIN 2011: Temporal 2016: JSON, Row Pattern Matching
  13. 13. DOCUMENTAÇÃO https://www.postgresql.org/docs/ https://www.postgresql.org/docs/current/static/index.html https://www.postgresql.org/docs/9.6/static/index.html https://www.postgresql.org/docs/9.5/static/index.html
  14. 14. OO respirem …
  15. 15. EXTENSIBILIDADE
  16. 16. ESTENDENDO PYTHON Python import spam status = spam.system("ls -l") C #include <Python.h> static PyObject * spam_system(PyObject *self, PyObject *args) { const char *command; int sts; if (!PyArg_ParseTuple(args, "s", &command)) return NULL; sts = system(command); return Py_BuildValue("i", sts); }
  17. 17. ESTENDENDO POSTGRESQL
  18. 18. VIA CATÁLOGO # dt pg_catalog. List of relations Schema | Name | Type | Owner ------------+-------------------------+-------+---------- pg_catalog | pg_aggregate | table | postgres ... pg_catalog | pg_class | table | postgres ... pg_catalog | pg_database | table | postgres pg_catalog | pg_foreign_data_wrapper | table | postgres pg_catalog | pg_foreign_server | table | postgres pg_catalog | pg_foreign_table | table | postgres pg_catalog | pg_index | table | postgres ... pg_catalog | pg_language | table | postgres ... pg_catalog | pg_operator | table | postgres ... pg_catalog | pg_type | table | postgres pg_catalog | pg_user_mapping | table | postgres
  19. 19. FUNÇÕES, OPERADORES, TIPOS E DOMÍNIOS Criando um dominio de dados para CPF e um operador unário que o valida: BEGIN; DROP SCHEMA IF EXISTS teste CASCADE; CREATE SCHEMA teste; SET search_path TO teste; CREATE OR REPLACE FUNCTION cpf_valido(numeric) RETURNS BOOLEAN LANGUAGE SQL COST 10 IMMUTABLE STRICT AS $_$ with cpf as ( select $1 as numero ), cpf_formatado as ( select lpad(cpf.numero::text,11,'0') as numero from cpf ), matriz as ( select regexp_split_to_table( cpf_formatado.numero, E's*' ) as valor from cpf_formatado ), digitos_por_posicao_1 as ( select row_number() over () as posicao, valor::int
  20. 20. from matriz ), digitos_por_posicao_2 as ( select posicao - 1 as posicao, valor from digitos_por_posicao_1 ), digito_1 as ( select sum(posicao*valor) as soma, sum(posicao*valor) % 11 as resto from digitos_por_posicao_1 where posicao<=9 ), digito_2 as ( select sum(posicao*valor) as soma, sum(posicao*valor) % 11 as resto from digitos_por_posicao_2 where posicao<=9 ), cpf_esperado as ( select array_to_string(array_agg(valor),'')::numeric as numero from ( select valor from digitos_por_posicao_1 where posicao <=9 union all select resto from digito_1 union all select resto from digito_2 ) as foo ) select distinct cpf.numero = cpf_esperado.numero from cpf, cpf_esperado; $_$; CREATE OPERATOR #? ( LEFTARG = numeric, PROCEDURE = cpf_valido
  21. 21. ); CREATE DOMAIN cpf AS numeric CHECK ( cpf_valido(VALUE) ); COMMIT; E agora testar para ver como funciona… SET search_path TO teste; DROP TABLE IF EXISTS teste.pessoa; SELECT cpf_valido(59328253241); SELECT 59328253241 #? AS cpf_valido; SELECT 37821042773 #? AS cpf_valido; SELECT 91416742433 #? AS cpf_valido; SELECT 91416000433 #? AS cpf_valido; SELECT 37821042003 #? AS cpf_valido; SELECT NOT 37821042003 #? AS cpf_valido; SELECT NOT 91416000433 #? AS cpf_valido; CREATE TABLE teste.pessoa ( nro_cpf cpf ); INSERT INTO teste.pessoa VALUES(88229346798); INSERT INTO teste.pessoa VALUES(45476684425); E se eu tentar inserir CPF INVALIDO!? INSERT INTO pessoa VALUES(45076684425); INSERT INTO pessoa VALUES(81249396798);
  22. 22. VIA C #include "postgres.h" #include <string.h> #include "fmgr.h" #include "utils/geo_decls.h" #ifdef PG_MODULE_MAGIC PG_MODULE_MAGIC; #endif PG_FUNCTION_INFO_V1(makepoint); Datum makepoint(PG_FUNCTION_ARGS) { /* Here, the pass-by-reference nature of Point is not hidden. */ Point *pointx = PG_GETARG_POINT_P(0); Point *pointy = PG_GETARG_POINT_P(1); Point *new_point = (Point *) palloc(sizeof(Point)); new_point->x = pointx->x; new_point->y = pointy->y; PG_RETURN_POINT_P(new_point); } E para o SQL reconhecer esta função, preciso criá-la em meu banco. CREATE FUNCTION makepoint(point, point) RETURNS point AS 'DIRECTORY/funcs', 'makepoint' LANGUAGE C STRICT;
  23. 23. VIA LINGUAGEM_DO_SEU_CORACAO Criar a linguagem utilizando extensão: create extension if not exists plpython2u; create or replace function array_transpose(a float[]) returns float[] language plpython2u as $$ import numpy as np return np.array(a).transpose() $$; E usar ela no SQL: select array_transpose(array[1.0, 2.0, 4.5]); Mas com algumas limitações, as vezes: select array_transpose(array[ array[1.0, 2.0], array[4.5, 7.8]]);
  24. 24. ERRO: não pode converter matriz multidimensional para lista python detalhe: pl/python só suporta matrizes unidimensionais. contexto: função pl/python "array_transpose"/
  25. 25. REPOSITÓRIO DE EXTENSÕES
  26. 26. PYPI pip search … pip install … …
  27. 27. PGXN CLIENT pgxn search … pgxn install … …
  28. 28. INTEROPERABILIDADE
  29. 29. LIBPQ async non-block stream (controle de uxo) text/binary noti cações assíncronas (LISTEN/NOTIFY) COPY (trasferência de dados)
  30. 30. PSYCOPG2 Exemplo básico de execução: import psycopg2 dbconn = psycopg2.connect(host="/var/run/postgresql", dbname="guedes") cursor = dbconn.cursor() cursor.execute(""" SELECT relname FROM pg_class WHERE relkind='r' """) for row in cursor.fetchall(): print("Tabela: {}".format(row[0])) cursor.close() dbconn.close()
  31. 31. implementado em C, como wrapper da libpq noti cações COPY … criação de tipo personalizados equivalencia de tipos Python vs PostgreSQL from psycopg2.extensions import adapt, register_adapter, AsIs class Point(object): def __init__(self, x, y): self.x = x self.y = y def adapt_point(point): x = adapt(point.x).getquoted() y = adapt(point.y).getquoted() return AsIs("'(%s, %s)'" % (x, y)) register_adapter(Point, adapt_point) cur.execute("INSERT INTO atable (apoint) VALUES (%s)", (Point(1.23, 4.56),)) INSERT INTO atable (apoint) VALUES ('(1.23, 4.56)');
  32. 32. CURIOSIDADE A biblioteca psycopg2 e o cliente de linha de comando pgxn são de autoria de Daniele Varrazzo
  33. 33. :| respirem …
  34. 34. "O POSTGRÊS" Costumamos falar em "um código Pythônico"… mas e com SQL?
  35. 35. O ANINHADOR FRENÉTICO
  36. 36. PROBLEMA SELECT ..., CASE WHEN sobrenome IS NULL THEN nome WHEN sobrenome IS NOT NULL THEN sobrenome || ',' || nome END FROM ...
  37. 37. SOLUÇÃO Dai você vai lá e mostra como faz… SELECT ..., COALESCE(sobrenome || ',', '') || nome FROM ...
  38. 38. O ANINHADOR FRENÉTICO II
  39. 39. PROBLEMA SELECT ..., CASE WHEN COALESCE(endereco, '') <> '' THEN CASE WHEN COALESCE( COALESCE(endereco, '') || ' ' || COALESCE(bairro, '') ) <> ' ' THEN endereco ||' '|| bairro ELSE COALESCE(cidade, '') END ELSE COALESCE(cidade,'SEM CIDADE') END FROM ... LEFT JOIN ... LEFT JOIN ...
  40. 40. POSSÍVEL SOLUÇÃO SELECT ..., COALESCE(endereco ||' '|| bairro, cidade, 'SEM CIDADE'), FROM ... LEFT JOIN ... LEFT JOIN ...
  41. 41. OPA! TRÊS PARÂMETROS? SELECT ..., COALESCE(endereco ||' '|| bairro, cidade, 'SEM CIDADE'), ^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^ ^^^^^^^^^^ FROM ... LEFT JOIN ... LEFT JOIN ...
  42. 42. QUAL É O RESULTADO DISTO? SELECT ..., COALESCE(NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'SEM VALOR'), COALESCE(NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'SEM VALOR'), COALESCE(NULL, NULL, NULL, NULL, NULL, NULL, 'SEM VALOR'), COALESCE(NULL, NULL, NULL, NULL, NULL, 'SEM VALOR'), COALESCE(NULL, NULL, NULL, NULL, 'SEM VALOR'), COALESCE(NULL, NULL, NULL, 'SEM VALOR'), COALESCE(NULL, NULL, 'SEM VALOR'), COALESCE(NULL, 'SEM VALOR'), ... FROM ...
  43. 43. COMO ISSO É POSSÍVEL?
  44. 44. ???
  45. 45. ??? VARIADIC + SYNTAX SUGAR CREATE OR REPLACE FUNCTION menor_de_todos(VARIADIC valores numeric[]) RETURNS numeric AS $$ SELECT min($1[valor]) FROM generate_subscripts($1, 1) as g(valor); $$ LANGUAGE SQL; SELECT menor_de_todos(10, 11, 12, 30, -20, -30) as menor; /* menor -------- -30 (1 row) */ Parâmetros! Não é para passar um ARRAY não! SELECT menor_de_todos(ARRAY[10, 11, 12, 30, -20, -30]) as menor; ^^^^^^ `-- assim da ruim
  46. 46. CONHEÇA BEM AS FERRAMENTAS QUE VOCÊ USA
  47. 47. O POSTGRES TEM UM TYPO JSON E UM TIPO JSONB, SABIA? E suporte índices! { "nome": "Joao", "endereco" : { "cep": "88000-00", "rua": "Das Saudades", "nro": 453, "bairro": "Centro" }, "dependentes": [ { "nome": "Maria", "parentesco": "esposa" }, { "nome": "Mario", "parentesco": "filho" }, { "nome": "Marina", "parentesco": "filha" } ] }
  48. 48. AS FUNÇÕES DE AGREGAÇÃO DO POSTGRES SÃO COMO MAP- REDUCE https://www.postgresql.org/docs/current/static/xaggr.html
  49. 49. AS VEZES TEM FUNÇÕES QUE VOCÊ NEM IMAGINA SELECT make_date(2017, 7, 7);
  50. 50. O EXPLORADOR DO DESCONHECIDO
  51. 51. NONE VS NULL Qual é o resultado desta expressão em Python? print(None + 1) E qual é o resultado desta expressão no PostgreSQL? SELECT NULL + 1 as resultado;
  52. 52. NULL E A ARITIMÉTICA t SELECT NULL = NULL; SELECT NULL > NULL; SELECT NULL < NULL;
  53. 53. O QUE É NULL? t SELECT NULL IS NULL; => true SELECT NULL IS DISTINCT FROM NULL; => false SELECT NULL IS NOT DISTINCT FROM NULL; => true SELECT 1 IS NULL; => false SELECT 1 IS DISTINCT FROM NULL; => true SELECT 1 IS NOT DISTINCT FROM NULL; => false
  54. 54. TESTE DE ATENÇÃO!
  55. 55. LEMBRAM DA FUNÇÃO MENOR_DE_TODOS? SELECT menor_de_todos(10, 11, 12, 30, -20, -30) as menor;
  56. 56. E SE EU PASSAR NULL? SELECT menor_de_todos(10, 11, 12, NULL, -20, -30) as menor;
  57. 57. EXPLICAÇÃO menor_de_todos(...) usa a função min(...) que é uma função de agregação e funções de agregação ignoram NULL.
  58. 58. O FABRICADOR DE REGISTROS
  59. 59. UM REGISTRO TAMBÉM É CHAMADO DE TUPLA! SELECT ROW(10, 'JOAO', 1500.50);
  60. 60. DOIS REGISTROS SENDO COMPARADOS! SELECT ROW(10, 'JOAO', 1500.50) = ROW(10, 'JOAO', 1500.50); => true SELECT ROW(10, 'JOAO', 1500.50) > ROW(9, 'PEDRO', 500.50); => true SELECT ROW(1, 'MARIA', 1000.10) > ROW(1, 'MARIA', 1000.11); => false SELECT ROW(100, 'JOANA', 10.60) < ROW(100, 'JOANA', NULL); => ?????
  61. 61. NULL! Sim, o resultado é NULL, porque o resultado é desconhecido.
  62. 62. :/ respirem …
  63. 63. LEMBRA O INSERT? INSERT INTO ... VALUES (1, 'JOAO', 1500.10);
  64. 64. PENSA NO VALUES! /* INSERT INTO ... */ VALUES (1, 'JOAO', 1500.10); -- FUNCIONA!
  65. 65. VALUES É UM COMANDO SOZINHO! INSERT INTO ... SELECT codigo, nome, valor FROM tabela_temporaria; INSERT INTO ... VALUES (1, 'JOAO', 1500.10); VALUES (1, '...', 1500.10), (2, '...', 500.00), (3, '...', 100.00), (4, '...', 50.50), (5, '...', 3500.00) ; SELECT * FROM ( VALUES (1, '...', 1500.10), (2, '...', 500.00), (3, '...', 100.00), (4, '...', 50.50), (5, '...', 3500.00) ) AS foo WHERE column3 > 100; -- quais registros aparecem?
  66. 66. PARA O INFINITO, E ALÉM
  67. 67. SIM, TUDO ISSO É POSSÍVEL SELECT '+Infinity'::float > 999999999999999999999 9999999999999999999999999999999999999999999999999 9999999999999999999999999999999999999999999999999 9999999999999999999999999999999999999999999999999 9999999999999999999999999999999999999999999999999 9999999999999999999999999999999999999999999999999 999999999999999999999999999999999999999999; => true SELECT '-Infinity'::float < 999999999999999999999 9999999999999999999999999999999999999999999999999 9999999999999999999999999999999999999999999999999 9999999999999999999999999999999999999999999999999 9999999999999999999999999999999999999999999999999 9999999999999999999999999999999999999999999999999 999999999999999999999999999999999999999999; => true
  68. 68. INFINITO PARA DATAS, TAMBÉM, CLARO! SELECT 'Infinity'::date > current_date; => true INSERT INTO elemento(nome, validade) VALUES ('uranio', 'Infinity'); isto é um date _.^^^^^^^^ SELECT 'today'::interval = current_date; => true SELECT 'yesterday'::date = 'today'::date - interval '1 day'; => true SELECT 'tomorroy'::date = 'today'::date + interval '1 day'; => true SELECT current_date + 'allballs'::time; => '2015-09-18 00:00:00'
  69. 69. E TUDO PODE SER RESCRITO COMO … SELECT date 'Infinity' > current_date; => true INSERT INTO elemento(nome, validade) VALUES ('uranio', 'Infinity'); isto é um date _.^^^^^^^^ SELECT interval 'today' = current_date; => true SELECT date 'yesterday' = date 'today' - interval '1 day'; => true SELECT date 'tomorroy' = date 'today' + interval '1 day'; => true SELECT current_date + time 'allballs'; => '2015-09-18 00:00:00'
  70. 70. NANANANANANANAN SELECT 'NaN'::numeric + 1; => 'NaN'
  71. 71. LATERAL JOIN SELECT conta, ultimo_movimento.valor FROM movimento m LATERAL (SELECT valor FROM movimento _m WHERE _m.conta = m.conta AND _m.data < m.data ORDER BY data DESC LIMIT 1) as ultimo_movimento WHERE m.data = current_date AND m.conta = 1214124;
  72. 72. VAMOS VOLTAR UM POUCO PARA O PYTHON? antes… só mais uma coisinha ….
  73. 73. :) respirem …
  74. 74. FDW - FOREIGN DATA WRAPPERS le_fdw postgres_fdw mysql_fdw mongo_fdw multicorn
  75. 75. FDW - UM EXEMPLO NATIVO Exemplo do postgres_fdw, ou seja, um Postgres conversando com outro… CREATE EXTENSION postgres_fdw; CREATE SERVER servidor_de_consultas FOREIGN DATA WRAPPER postgres_fdw OPTIONS (host '10.100.1.1', dbname 'filial_sul', port '5432'); CREATE USER MAPPING FOR CURRENT_USER SERVER servidor_de_consultas OPTIONS (user 'consulta', password 'consulta'); CREATE FOREIGN TABLE pessoas (cpf numeric, nome varchar) SERVER servidor_de_consultas OPTIONS ( schema_name 'recursos_humanos', table_name 'tb_funcionarios'); EXPLAIN (ANALYZE,VERBOSE, BUFFERS) SELECT * FROM pessoas WHERE cpf = 1234567891; QUERY PLAN ------------------------------------------------------------------------------- Foreign Scan on public.pessoas (cost=100.00..118.06 rows=3 width=104) Output: cpf, nome Remote SQL: SELECT cpf, nome
  76. 76. FROM recursos_humanos.tb_funcionarios WHERE ((cpf = 1234567891::numeric)) Planning time: 0.061 ms Execution time: 105.232 ms (5 registros)
  77. 77. FDW - UM EXEMPLO MULTICORN SHOW ME THE CODE!! –> Telegram FDW
  78. 78. CONCLUSÕES Saiba o quanto você sabe Saiba o quanto você ainda não sabe Saiba que jamais saberás tudo mas seja curioso Leia e se questione: "Será que …?" Ensine o que aprendeu e …
  79. 79. :D inspirem …

×