Python & MySQL: Como interagir com bases de dados a partir de scripts [Wiki Portugal-a-Programar]
Entrar Ferramentas de Site
Pesquisar FerramentasRevisões antigasBacklinksAlt. RecentesGestor de MediaÍndiceEntrar> Alt. RecentesGestor de MediaÍndice Está aqui: Wiki P@P » Arquivo da Revista Programar » 14ª Edição » Python & MySQL: Como interagir com bases de dados a partir de scripts
revistaprogramar_arquivo:14_edicao:pythonmysql
Python & MySQL: Como interagir com bases de dados a partir de scripts
Bases de dados são armazéns estruturados de informação, nas quais é guardada uma variedade imensa de dados. Na verdade, são muitas vezes o núcleo duro de aplicações informáticas, sem que, também na maioria das vezes, o utilizador final se aperceba. A importância desta tecnologia hoje em dia é imensa, sendo que foi necessário o desenvolvimento de ferramentas para que programadores possam dela tirar partido. Entre essas ferramentas, incluem-se diversos sistemas de gestão de bases de dados, como o MySQL, o SQLServer, a Oracle, entre outros, que permitem a manutenção das bases de dados de uma maneira relativamente simples. Porém, também para estas ferramentas de gestão foi desenvolvido software para facilitar ainda mais a vida a quem desenvolve. Neste artigo pretende-se explicar e exemplificar o uso de uma API que permite a manutenção de bases de dados usando MySQL a partir de scripts de Python. Porém, não é limitado apenas a MySQL. Outros adaptadores para outros sistemas de gestão de bases de dados funcionam de maneira muito semelhante, por vezes até bastando apenas mudar uma linha de código.
Ligação ao servidor:
ligação = MySQLdb.connect('localhost', 'utilizador', 'password')
MySQLdb.connect(servidor, nome_utilizador, palavra_chave, base_de_dados)
[ ...... ]
_mysql_exceptions.OperationalError: (1049, "Unknown database 'teste'") É-nos devolvida uma excepção, que pode ser aproveitada. De facto, uma vez perguntei numa mailing-list se não havia maneira de ligar a um servidor e verificar se dada base de dados ou tabela existia. A resposta foi consensual: mesmo que exista, lidar com estas excepções torna-se o processo mais simples.
A biblioteca MySQLdb traz consigo um método que permite então lidar com as excepções: MySQLdb.Error. Chamando este método através de um except, pode-se aceder a 2 argumentos: o número do erro e a mensagem do erro. No nosso caso, vemos que o erro tem o número 1049. Vamos então melhorar o nosso código para incluir o tratamento deste erro:
connection = MySQLdb.connect(servidor , nome_utilizador, palavra_chave, base_de_dados)
if e.args[0] == '1049':
if (raw_input('Base de dados inexistente. Deseja criar?')) == 's':
connection = MySQLdb.connect(servidor , nome_utilizador, palavra_chave)
cursor.execute('CREATE DATABASE %s' %base_de_dados)
Este excerto de código inclui exemplos de métodos ainda não explicados, mas cada coisa a seu tempo. De facto, como se pode observar, a excepção gerada tem 2 argumentos, sendo o primeiro, tal como já havia dito, o número do erro (e.args[0]). Podemos depois decidir como lidar com o problema. Neste caso, optei por perguntar ao utilizador se queria criar a base de dados teste, uma vez que esta ainda não existia. Caso a resposta fosse afirmativa, o programa encarregava-se de ligar ao servidor, criar um cursor, construir a query de SQL que cria a base de dados, e executar o comando. Antes de avançarmos para a definição de cursor, e dos seus métodos, deixo antes um link para uma listagem dos erros, e respectivos códigos numéricos:
Este pequeno pedaço de código ilustra um método associado ao cursor que nos é indispensável: execute(). É este método que permite a interacção "directa", por assim dizer, com a base de dados. É através dele que passamos os comandos de SQL e que fazemos perguntas, que criamos tabelas e campos, que preenchemos bases de dados, ou que as actualizamos, ou mesmo destruimos. Como vimos, a sintaxe é relativamente simples: o código SQL é passado como argumento à função execute(), sob forma de uma string.
Para além do método execute(), supondo que queremos efectuar vários comandos similares de uma só vez, por exemplo, uma múltipla inserção, podemos recorrer a um método "irmão", mais "guloso": executemany(). A sua sintaxe é semelhante à do execute().
listaValores = [  ('Vermelho', 'Benfica'),  ('Azul', 'Campeão'),  ('Verde', 'Sporting')] # no pun intended :)
cursor.executemany("INSERT INTO tabela1 (campo1, campo2) VALUES (%s,
%s)", listaValores)
O outro método relevante na interacção com as bases de dados é o método fetchone(). Até aqui, tínhamos apenas interagido com a base de dados numa relação unidireccional (utilizador –> base de dados). Contudo, o método fetchone(), bem como os associados fetchmany() e fetchall(), permitem-nos tornar essa interacção bidireccional, tornando possível ao utilizador recuperar informação inserida na base de dados. A sintaxe do comando é relativamente simples. Após um execute() com uma string de SQL que envolva um SELECT e que nos devolva n resultados, podemos aceder aos resultados usando uma das três funções - fetchone(), fetchmany(), fetchall() - consoante queiramos um, vários, ou todos os resultados. Para definirmos o número de resultados a ver no fetchmany() usamos outro método do cursor: arraysize. Este, aceita um valor inteiro que, por defeito, é 1. Segue-se um exemplo:
resultado = cursor.fetchone()
Este método devolve uma tupla de resultados, contendo uma linha por cada resultado, e caso o SQL não devolva resultados, o método devolve None. Simples e eficaz. Para aceder ao conteúdo da linha podemos ou imprimir a variável linha ou, caso queiramos uma coluna em específico, aceder tal como a uma lista: resultado[0], resultado[2], etc.
connection.commit()
Conclusão Como vimos, interagir com bases de dados em MySQL através de scripts de Python torna-se, graças à MySQLlib, como dizem os ingleses, "a walk in the park", ou, em bom português, "como tirar o doce a uma criança". Uma vantagem interessante desta biblioteca, é que o seu código é exactamente igual ao usado por outras bibliotecas que acedem a outros provedores de bases de dados, como a SQLite ou o PostgreSQL. Deixo, em jeito de despedida, links para bibliotecas em Python para fazer ligação a outras bases de dados, bem como o desafio de lhes aplicarem este código e, ou me dizerem que funciona, ou me enviarem hate-mails porque não funciona!
sqlite3 (incluida com o Python 2.5 - Batteries Included pessoal ;)
revistaprogramar_arquivo/14_edicao/pythonmysql.txt · Esta página foi modificada pela última vez em: 2014/09/02 12:39 (Edição externa)