Curso web2py

DAL (Database Abstraction Layer)

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.

Conexão ao 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.

Criando tabelas

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.

Definindo campos da tabela

O construtor Field pode receber diferentes valores:

Field('nome', 'string', length=256, default=None, requires='<default>', 
    notnull=False, label=None)
  1. O tipo do campo é string quando não especificado, caso contrário precisamos deixar explícito um tipo no formato de string (ex: 'integer', 'double', 'text', 'upload', etc).
  2. O valor de length é o tamanho máximo do campo, recomendado somente para campos do tipo string, upload ou password.
  3. default indica um valor padrão para ser usado quando o registro não informar nenhum valor para o campo.
  4. A opção requires associa validadores de formulários ao campo.
  5. notnull indica se o campo deve ser preenchido ou é opcional. Seu valor padrão é False, indicando que é opcional.
  6. O valor de label é o nome que será exibido para aquele campo quando essa tabela for transformada em um formulário para receber dados do usuário.

Consulte uma lista de tipos de campos e todos os seus valores possíveis na documentação do web2py.

Select

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()

Insert, update, update_record e delete

As principais maneiras de interagir com tabelas são as inserções, edições e deleções de registros.

insert

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.

update e update_record

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.

delete

db(db.gatos.id == gato).delete()

Com o método delete excluímos o registro do banco de dados.