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>');