Semana passada surgiu uma dúvida na lista python-brasil ,
manipulação de datas com o pymssql e como eu tenho interesse na utilização de Python com o MS-SQL dei bastante atenção à dúvida, gerando minha primeira colaboração com código a um projeto Open Source.
O Problema
Em um comando INSERT desejava-se inserir uma data no banco de dados.
No Python 2.4 temos o objeto datetime para trabalhar com datas, porém o driver de acesso ao banco (pymssql) não reconhece esse tipo e isso nos obriga a converter a data para string antes de enviar ao pymssql.
Obviamente essa conversão é uma responsabilidade do driver pymssql.
Simulei o erro com esse código:
>>> import pymssql
>>> pymssql.__version__
>>> from datetime import datetime
>>> con = pymssql.connect(host='server', user='usuario', password='senha', database='base')
>>> cur = con.cursor()
>>> cur.execute('insert into PrazoLog(Data) values(%s)',>>> [datetime(2006, 7, 20, 11, 6, 14)])
>>> con.commit()
Contornando o Problema
Após eu conseguir simular o erro na minha máquina fui investigar como contornar o erro, e graças ao fato do Python ser executado a partir dos fontes eu pude ler o código do pymssql que estava instalado na minha máquina sem ter que consultar o site, repositórios ou qualquer outro local.
Novamente graças ao Python executar os fontes, pude fazer alterações nos fontes do pymssql e simplemente testar. Obviamente como não desenvolvo constantemente em Python fiz meus testes e debugs de forma bem artesanal (usando prints).
Apenas consultando o e-mail com o problema e os arquivos que já estavam na minha máquina consegui chegar em um patch que permitia contornar o problema de forma simples rápida e ao meu ver bem feita.
Tomei alguns cuidados que achei importante, como tentar não adicionar mais uma dependência ao pymssql. A versão do pymssql que eu disponho não depende do módulo datetime e como eu sabia que esse módulo foi incorporado somente na versão 2.4 não queria adicionar essa dependência.
Lembrei-me, então, do duck typing. Como eu queria apenas o método timetuple da classe datetime.datetime. Apenas verifiquei se o objeto tem o método e tendo-o eu executo-o.
Funcionou que foi uma beleza :), testei nas 3 versões do MS-SQL que eu tenho aqui na empresa (7.0, 2000, 2005) e funcionou. Fiquei empolgado e eufórico! Mandei a minha correção para a lista e o Girão, que é quem teve o problema, falou que funcionou beleza e gostou da correção.
Colaborando com a Comunidade
Aproveitando a euforia e a “aprovação” do Girão fui a página do projeto para enviar a minha proposta de patch. O projeto está no sourceforge.net , dei uma olhada no Fórum e todas as mensagens não recebiam respostas 😦 e não achava nenhum link do tipo “reporte um bug”.
Mas navegando pelo site do projeto achei uma nota sobre a dependência do módulo datetime e achei bem estranha. Então fui verificar os fontes, nos fontes da minha máquina não via nada que levasse ao módulo datetime, então fui consultar o repositório CVS.
Qual não foi minha surpresa quando a versão do CVS revelou-me que a dependência era justamente para solucionar o mesmo problema que eu tinha solucionado :S . Fiquei meio triste, pois pensei, re-invetei a roda, mas fiquei contante pois ainda achava minha solução mais adequada por não adicionar a tão falada dependência.
Apelei e mandei o patch direto para os 2 e-mails de desenvolvedores que eu achei no site.
Após 4 dias o Andrzej Kukula, um dos desenvolvedores, me respondeu dizendo que o meu patch seria incorporado no projeto! 😀 A empolgação foi total !
Moral da História
- O Python facilita a leitura e a depuração dos fontes
- Sempre verificar a versão do CVS/SVN
- Colaborar com algum projeto não é tão difícil assim
- Precisa-se de:
- um pouco de interesse
- um pouco de experiência para saber o que esperar de um módulo/biblioteca/framework, pois para mim (e para o Girão também) a conversão de tipo era função do módulo pymssql
- um pouco de inglês
- o que eu menos precisei foi conhecer bem a linguagem – eu acho
- e por último, mas não menos importante, colaborar é empolgante e divertido, principalmente em Python 😉
O que posso dizer além de parabéns? 🙂
Muito legal sua contribuição e também sua vontade de compartilhar essa experiência com seus leitores.
Grande abraço
Valeu Dirceu, obrigado também pelo apoio ao blog. 😉
A idéia do post é alem de poder expor minha empolgação mostrar que é simples contribuir.
Até mais.
Parabéns pelo blog e principalmente pela iniciativa de contribuir com um projeto, isso é muito importante.
Muito bom seu post, também “linkei” o seu blog.
E o tema é do proprio blogger, o nome do tema é: Tekka, tem nos modelos, a unica coisa que mudei foi colocar o espaco para links na mao.
Grandes abracos Luciano, nos encontramos na lista.
Parabéns, Luciano!
Lendo seu texto deu vontade de pegar o primeiro projeto que eu visse na frente e sair corrigindo bugs 🙂
Legal, cara. Sucesso!
Colaborar certamente é divertido.
Eu colocaboro como me é mais fácil agora, com traduções.
Porém, tive uma experiência contrária à sua.
Precisei testar um webservice em python. Queria que ele rodasse no mod_python. Não funcionou. Encontrei o que julguei ser um bug, enbora não soubesse como corrigir.Relatei na lista do ZSI. Ninguém respondeu. Abri um bug no sourceforge. Ninguém respondeu.
Fiquei frustrado. Mas isso, geralmente é a exceção.
A comunidade geralmente é ótimo
ruivaldo, legal saber que o post conseguiu transmitir a minha empolgação a ponte de empolgar o leitor. 😀 E obrigado pelo apoio.
Walter, obivamente antes desta contribuição com código eu já passei por frustações também.
E minhas contribuições normalmente são correções no nosso wiki.
Quando acontecer de tentar ajuda/apoio no projeto principal e não conseguir, tente mandar lá para a lista ou tente falar com alguém no canal IRC.
Obrigado também por comentar. 🙂
Até mais.
Parabéns, Luciano!
Eu já dei uma olhada no código do pymssql e ele realmente tem umas coisas “estranhas”. Quer dizer, agora tem uma a menos, né? 🙂
O datetime na verdade já está disponível desde o Python 2.3, mas se você conseguiu fazer o trabalho sem adicionar uma dependência, melhor ainda!
Mano, parabéns!!! Não entendi bulhufas (já q não sou da área), mas fico mt orgulhosa de vc!!!! 🙂
Irmã coruja é fogo, né?!
bjs e continue mandando bala!!
É isso aí muleque!!!!
Parabéns….
Aquele abraço,–>
heheh! Obrigado pelo feedback Luciano.. Não tá na hora da segunda colaboração não? =)
Oi Mor!
Não entendi nadinha do que escreveu, mas fico muito orgulhosa de ver vc correndo atrás das coisas que gosta e ainda ajudando os outros.
BeijãoZão!!!
🙂