sexta-feira, julho 06, 2007

Python e MySQL

Depois de algum tempo sem postar aqui no blog, vou mostrar um pouco sobre o modulo de Python para acessar um banco de dados MySQL, é o MySQLdb.

No Debian, Ubuntu, etc.... aptitude install python-mysqldb.

Eu presumo que você já saiba algo sobre MySQL, pois não vou falar sobre ele. Bem, depois depois do módulo baixado e instalado, vamos ver se ta funcionando:

>>> import MySQLdb
>>> print MySQLdb.__doc__
MySQLdb - A DB API v2.0 compatible interface to MySQL.

This package is a wrapper around _mysql, which mostly implements the
MySQL C API.

connect() -- connects to server

See the C API specification and the MySQL documentation for more info
on other items.

For information on how MySQLdb handles type conversion, see the
MySQLdb.converters module.

Tudo bem. Para se conectar ao banco é bem simples:

conexao = MySQLdb.connect('host', 'usuario', 'senha', 'banco')

Depois de estabelecida a conexão, é preciso criar um objeto "cursor", é ele quem vai executar os comandos SQL, assim como rebecer os dados que um comando SELECT por exemplo, vou mostrar adiante.
Primeiro vamos criar uma tabela que guarda um nome e um email, será a tabela Dados (o banco deve ser previamente criado):

import MySQLDB

conexao = MySQLdb.connect('host', 'usuario', 'senha', 'banco')
cursor = conexao.cursor()

cursor.execute('''create table Dados (
id int not null auto_increment primary key,
nome varchar(200) not null,
email varchar(100) not null );
''')

cursor.execute('''insert into Dados(nome, email)
values("igor", "igor@v2windcenter.com");
''')
cursor.close()
conexao.close()

O código acima vai criar uma tabela, e adicionar dados nessa tabela. Agora vamos retirar dados do banco, usando o interpretador mesmo:

>>> cursor.execute("SELECT * FROM Dados WHERE nome='igor'")
1L
>>> dados = cursor.fetchall()
>>> print dados
((1L, 'igor', 'igor@v2windcenter.com'),)

o método fetchall() do cursor, retorna todas as linhas que combinam com o SELECT que foi dado acima, observe que é uma tupla de tuplas...

>>> print dados[0][1]
igor
>>> print dados[0][2]
igor@v2windcenter.com

Como no SELECT foi usado *, para selecionar toda a linha, o retorno vai ser uma tupla de linhas que batem com a condição, mas vamos ver como seria para pegar apenas o nome (lembrando que nós temos a tabela dados, quem tem as colunas id, nome e email):

>>> cursor.execute("SELECT email FROM Dados WHERE nome='igor'")
1L
>>> print cursor.fetchone()
('igor@v2windcenter.com',)

o método fetchone() retornou todos os nomes(foi o que procuramos) que combinem com a condição acima. Aqui não é mais uma tupla de tuplas, e sim uma tuplas de valores, pois nós realmente estamos buscando por um unico valor da uma linha.

Bem,

>>> cursor.close()
>>> con.close()

isso é o básico para se inserir e retirar dados de um banco MySQL.
Para algo mais, visite a pagina no projeto:

http://sourceforge.net/projects/mysql-python


2 comentários:

rgregori disse...

Opa, eu achei teu blog procurando algo sobre threads e python ... estou me batendo um pouco aqui com um código, threads + SQL.
Quando chegar a uma conclusão posso compartilhá-la com você!

Mas esse post é pra passar uma dica, dá uma olhada no SQLAlchemy (www.sqlalchemy.org) e no Elixir (elixir.ematia.de). Eles fazem uma camada alto-nível para acesso a banco de dados, são uma mão na roda!

Nome: Igor Sobreira disse...

Olá Rodrigo,

Legal, se quiser mandar um artigo coloco aqui no blog sim. :)

Conheço o SQLAlchemy, mas nunca usei não. Já mechi um pouco com o SQLObject no TurboGears(turbogears.org). Mas como estou usando o Django(djangoproject.com), estou usando o ORM que já vem nele.

Não conheço o Elixir, vou dar uma olhada.

valeu...