PostgreSQLePython

PostgreSQL e Python

== PostgreSQL ==

O PostgreSQL (atualmente na versão 8.1, com a versão 8.2 planejada para ser lançada em breve) é, nas palavras dos próprias desenvolvedores "o banco de dados livre mais avançado do mundo". Inclui recursos poderosos como stored procedures (em PL/PgSQL), triggers, domains e muito mais.

Um dos campos nos quais o PostgreSQL se destaca é na programação de procedures. Embora a linguagem PL/PgSQL seja poderosa, devemos sempre ter em mente que a linguagem SQL é uma linguagem mais voltada à area da matemática, com o objetivo de descrever conjuntos e suas relações. Uma função em SQL, não é exatamente a mais bonita das funções (e pode ser mais feia ainda, dependendo do dialeto específico do seu banco). O PostgreSQL contorna essa limitação ao permitir o uso de outras linguagens de programação. São atualmente suportadas: python, ruby, tcl, perl, Java, PHP e C.

Porque Python no Postgres?

Porque python é uma linguagem poderosa, e com ela podemos estender as limitações do banco. Um exemplo: a maioria dos bancos proprietários possui alguma funcionalidade de enviar e-mail a partir do próprio banco de dados. O PostgreSQL, no geral, segue a filosofia Unix: faça uma coisa, e a faça bem. Ele não tem suporte a envio de e-mails integrado. Mas usando Python, podemos fazer isso.

Um exemplo

   1 -- Function: pysendmail(text, text, text, text, text)
   2 
   3 -- DROP FUNCTION pysendmail(text, text, text, text, text);
   4 
   5 CREATE OR REPLACE FUNCTION pysendmail(text, text, text, text, text)
   6   RETURNS "varchar" AS
   7 $BODY$
   8   # Author: Walter Rodrigo de Sá Cruz
   9   # Date: 26/04/2006
  10   from email.MIMEMultipart import MIMEMultipart
  11   from email.MIMEText import MIMEText
  12   from time import localtime, strftime
  13   import smtplib
  14   import re
  15  
  16   smtpserver = 'servidor'
  17   #AUTHREQUIRED = 0 # if you need to use SMTP AUTH set to 1
  18   smtpuser = ''  # for SMTP AUTH, set SMTP username here
  19   smtppass = ''  # for SMTP AUTH, set SMTP password here
  20  
  21   sender = args[0]
  22   recipients = args[1]
  23   cc = args[2]
  24   subject = args[3]
  25   mesage = args[4]  
  26 
  27   server = smtplib.SMTP(smtpserver)
  28   
  29   msg = MIMEMultipart('related')
  30   msg['Subject'] = subject
  31   msg['Date'] = strftime("%a, %d %b %Y %H:%M:%S -0300", localtime())
  32   msg['Cc'] = cc
  33   msg['From'] = sender
  34   msg['To'] = recipients
  35   msg.preamble = 'This is a multi-part message in MIME format.'
  36   
  37   msgAlternative = MIMEMultipart('alternative')
  38   msg.attach(msgAlternative)
  39   
  40   # Expressão regular roubada de http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/440481
  41   t = re.sub("< */? *\w+ */?\ *>", "", mesage) 
  42   msgText = MIMEText(t)
  43   msgAlternative.attach(msgText)
  44   
  45   msgText = MIMEText(mesage,'html')
  46   msgAlternative.attach(msgText)
  47   
  48  
  49   #if AUTHREQUIRED:
  50   #  server.login(smtpuser, smtppass)
  51   smtpresult = server.sendmail(sender, recipients, msg.as_string())
  52   server.quit()
  53 
  54 $BODY$
  55   LANGUAGE 'plpythonu' VOLATILE;
  56 ALTER FUNCTION pysendmail(text, text, text, text, text) OWNER TO postgres;

Após criada, a função poderá ser executada assim:

SELECT pySendMail('usuario@servidor.com','usuario@servidor.com','','E-mail do Postgres','Teste de envio <b> de e-mail</b>');

PostgreSQLePython (editada pela última vez em 2008-09-26 14:07:13 por localhost)