O web2py possui uma Camada de Abstração de Banco de Dados (DAL), uma API que mapeia objetos Python em objetos de banco de dados como queries, tabelas e registros. Isso significa que coisas de bancos de dados, como tabelas, são trasnformadas em objetos Python para que você consiga interagir com elas.
A DAL gera SQL dinamicamente, em tempo real, usando um dialeto específico para o back end do banco de dados utilizado para que você não tenha que escrever SQL ou sequer aprender diferentes dialetos SQL. Dessa forma, a aplicação também torna-se compatível com vários e diferentes tipos de bancos de dados.
O web2py dá suporte aos bancos de dados mais conhecidos, como SQLite, PostgreSQL, MySQL, Oracle e MongoDB entre outros.
Confira a seguir configurações e interações com o banco de dados.
Para realizar a conexão ao banco de dados, usa-se o construtor da DAL:
db = DAL('sqlite://storage.db')
Agora a conexão está associada à variável global db. Caso a string de conexão indique um arquivo inexistente da pasta /databases e não seja uma conexão com um banco de dados externo, o arquivo será criado após a primeira execução da aplicação. Maiores informações sobre o construtor podem ser encontradas na documentação do web2py.
As tabelas são criadas pelo construtor define_table:
db.define_table('gatos',
Field('nome'),
Field('raca'),
format = '%(nome)s'
)
Os principais elementos passados a uma tabela são seu nome, seus campos e o formato como ela será representada ('gatos', 'nome' e 'raça', e '%(nome)s' no caso). O formato especifica como serão exibidos seus registros quando forem referenciados em outras partes do código. Para uma lista completa de seus elementos acesse a documentação do web2py.
O construtor Field pode receber diferentes valores:
Field('nome', 'string', length=256, default=None, requires='<default>',
notnull=False, label=None)
Consulte uma lista de tipos de campos e todos os seus valores possíveis na documentação do web2py.
Para fazer a seleção de registros no banco de dados, utilizamos o método select. No caso, utilizamos uma query, que é o comando que você dará para selecionar apenas os registros que deseja. Por exemplo, dada uma tabela gatos:
rows = db(db.gatos.nome == 'Felix').select()
Desta forma, sua query limita o select para selecionar apenas os registros em que o campo nome seja igual a Felix.
Os registros selecionados ficam guardados em um objeto iterável do tipo Rows e cada registro é um objeto do tipo Row, que funciona como um dicionário:
for row in rows:
print row.raca
Persa
Siamês
Gato de Bengala
Da mesma forma, um registro pode ser selecionado pelo seu índice entre as rows:
row = rows[0]
Para selecionar somente um registro, fazemos:
row = db(db.gatos.id == 1).select().first()
As principais maneiras de interagir com tabelas são as inserções, edições e deleções de registros.
Temos que para uma tabela gatos:
gato = db.gatos.insert(nome=”Sr. Pelinhos”, raca=”Sphynx”)
Realizará a inserção de um registro na tabela, sendo que o campo nome receberá o valor “Sr. Pelinhos” e o campo raca o valor “Sphynx”. A variável gato receberá a id do registro após a inserção.
db(db.gatos.id == gato).update(raca=”Persa”)
ou
registro = db(db.gatos.id == gato).select().first()
registro.update_record(raca=”Persa”)
No primeiro caso, dizemos que o gato com aquele id terá sua raça atualizada para “Persa”. Assim, o registro do banco de dados será alterado. No segundo caso fazemos a mesma coisa, porém usamos uma Row para selecionar o registro a ser atualizado.
Cuidado: ao utilizar o método update em uma Row, somente a Row será atualizada e não o registro do banco de dados.
db(db.gatos.id == gato).delete()
Com o método delete excluímos o registro do banco de dados.