BancosDeDadosSql

Acesso a Banco de dados SQL

O Python não possui acesso nativo a bancos de dados SQL em sua biblioteca padrão, somente ao Berkley database engine(BDB), mas define uma API padrão que os drivers de acesso a esses bancos de dados devem seguir, assim qualquer que seja o banco de dados os procedimentos são parecidos.

Os quatro principais bancos de dados livres que podem ser acessados do Python são o SQLite, o MySQL, o PostgreSQL e o Interbase/Firebird.

Para cada um inicie importando os drivers:

   1 import MySQLdb # para o MySQL
   2 import sqlite  # para o SQLite
   3 from pyPgSQL import PgSQL # para o PostgreSQL
   4 import kinterbasdb # para Interbase / Firebird
   5 import pymssql  #para o MS-SQL. (existem outros módulos - ADOdb for Python/PHP)
   6 import cx_Oracle #para o Oracle

Nota: Não faça from driver import * porque isso fará com que o Python importe muito lixo para o namespace padrão, além disso, isso impossibilita o uso de mais de um driver ao mesmo tempo.

Conexão

Aqui os estilos variam muito pouco, com excessão do SQLite, que acessa um arquivo local onde está o banco de dados.

Para o MySQL:

   1 con = MySQLdb.connect('servidor', 'usuario', 'senha')
   2 con.select_db('banco de dados')

Para o SQLite:

   1 con = sqlite.connect('nome do arquivo', mode=775) # no futuro
   2                                                   # mode definirá o modo
   3                                                   # de trabalho

Para o PostgreSQL:

   1 con = PgSQL.connect(host='servidor',
   2                     database='banco de dados',
   3                     user='usuario',
   4                     password='senha')

Para o Interbase / Firebird:

   1 con = kinterbasdb.connect(dsn='servidor:/path/arquivo.fdb',
   2                           user='usuario',
   3                           password='senha')

Para o MS-SQL

   1 con = pymssql.connect(host = 'servidor',
   2                       user = 'usuario',
   3                       password = 'senha',
   4                       database = 'base de dados')

Para o Oracle

   1 con = cx_Oracle.connect('usuario/senha@tnsname')

Uso

Daqui pra frente todos os métodos da API são iguais.

Obtendo uma transação (cursor)

   1 cursor = con.cursor()

Executando um sql

   1 cursor.execute('ALGUM SQL')

É importante notar que para colocar parâmetros em sql a melhor forma é fazer de acordo com a API python, isto é, da seguinte forma:

   1 cursor.execute('INSERT INTO TABELA (CAMPO1, CAMPO2, CAMPO3) VALUES (?,?,?)', (valor1, valor2, valor3))

As variáveis valor1, valor2 e valor3 devem ser de um tipo compatível com a coluna correspondente do banco no sql. Isso porque ao passar parâmetros para ao sql dessa forma, você estará deixando a cargo do módulo de conexão ao seu banco o tratamento dos valores. Por exemplo, se valor1 for uma string, o módulo automaticamente colocará o valor entre aspas no lugar de ?. Se valor2 for uma data (datetime.datetime), o módulo convertela-á para o formato do banco. Isso é útil também para evitar sql injections.

Note também que usamos o caracter ? para representar o lugar onde um valor deve ser colocado pelo cursor.execute(). Esse caracter depende do módulo que você utilizar para conectar ao banco de dados, e essa propriedade chama-se paramstyle. Verifique este item na documentação do módulo ao começar a utlizá-lo.

Salvando as alterações

Depois de fazer um insert, update, ou delete, deveremos chamar o método commit() da conexão, para que as mudanças tenham efeito no banco.

   1 cursor.execute('INSERT INTO TABELA (CAMPO1, CAMPO2, CAMPO3) VALUES (?,?,?)', (valor1, valor2, valor3))
   2 con.commit()

Obtendo o resultado

   1 rs = cursor.fetchone() # busca uma linha ou;
   2 rs = cursor.fetchall() # busca todas as linhas ou;
   3 rs = cursor.dictfetchall() # busca todas as linhas,
   4                            # cada linha tem um dicionário
   5                            # com os nomes dos campos

O KInterbasDB (Interbase/Firebird) não possui suporte para o método:  dictfetchall() 

O MS-SQL também não possuí suporte para o método:  dictfetchall() 

E no resultado estarão os campos:

   1 print(rs[0]) # valor da primeira coluna.

Alternativamente você pode usar o cursor como um iterator:

   1 for linha in cursor:
   2     print linha[0] # valor da primeira coluna

Notas a respeito do Banco de dados

Bancos de Dados Proprietários

Embora todo paradigma possa e deva ser contestado, até mesmo para validá-lo, é consenso que a parte mais estável da aplicação são os dados, em conseqüência as diversas empresas que utilizam o BD Oracle podem optar por plataformas livres, mas provavelmente pensarão duas vezes antes de trocar o banco.

Na minha humilde opinião a Oracle tem uma das mais abusivas políticas de preços entre as empresas de software, mas é a líder no setor, portanto o desenvolvedor Python tem que estar preparado para acessar este BD.

Utilizo e recomendo para isto a biblioteca cx_Oracle, um módulo que permite o acesso a este BD de acordo com a especificação da API padrão do Python. (RômuloCampelo)

Notas a respeito dos Módulos


Obs: Inclui uma documentação inicial sobre o suporte ao Interbase/Firebird, e gostaria de ver mais informações sobre acesso a outros banco de dados nesta página :) -- JuracyFilho


RodrigoCesarHerefeld

BancosDeDadosSql (editada pela última vez em 2008-09-26 14:06:48 por localhost)