Web2py - Camada de abstração do banco de dados
o Database Abstraction Layer (DAL)é considerado o principal ponto forte do web2py. A DAL expõe uma interface de programação de aplicativos (API) simples para a sintaxe SQL subjacente.
Neste capítulo, vamos conhecer as aplicações não triviais do DAL, como a construção de consultas para pesquisar por tags de forma eficiente e a construção de uma árvore de categorias hierárquica.
Algumas características importantes do DAL são -
web2py inclui um Database Abstraction Layer (DAL), uma API que mapeia objetos Python em objetos de banco de dados. Os objetos de banco de dados podem ser consultas, tabelas e registros.
A DAL gera dinamicamente o SQL em tempo real usando o dialeto especificado para o back-end do banco de dados, de forma que não é obrigatório para um desenvolvedor escrever uma consulta SQL completa.
A principal vantagem de usar DAL é que os aplicativos serão portáveis com diferentes tipos de bancos de dados.
Primeiros passos com DAL
A maioria dos aplicativos em web2py requer uma conexão de banco de dados. Portanto, construir o modelo de banco de dados é a primeira etapa no design de um aplicativo.
Considere o aplicativo recém-criado chamado “helloWorld”. O banco de dados é implementado sob os modelos do aplicativo. Todos os modelos para a respectiva aplicação constam do arquivo denominado -models/db_custom.py.
As etapas a seguir são usadas para implementar DAL -
Etapa 1 - Construtor DAL
Estabeleça uma conexão com o banco de dados. Isso é criado usando o objeto DAL, também chamado de construtor DAL.
db = DAL ('sqlite://storage.sqlite')
A característica notável do DAL é que permite múltiplas conexões com o mesmo banco de dados ou com bancos de dados diferentes, mesmo com diferentes tipos de banco de dados. Observa-se que esta linha já está no arquivomodels/db.py. Portanto, você pode não precisar dele, a menos que tenha excluído ou precise se conectar a um banco de dados diferente. Por padrão, web2py se conecta a um banco de dados SQLite armazenado em arquivostorage.sqlite.
Este arquivo está localizado na pasta de bancos de dados do aplicativo. Se o arquivo estiver ausente, ele será criado por web2py quando o aplicativo for executado pela primeira vez.
O SQLite é rápido e armazena todos os dados em um único arquivo. Isso significa que seus dados podem ser facilmente transferidos de um aplicativo para outro. Na verdade, o (s) banco (s) de dados SQLite são empacotados pelo web2py junto com os aplicativos. Ele fornece suporte SQL completo, incluindo traduções, junções e agregações.
Existem duas desvantagens do SQLite.
Uma é que ele não impõe tipos de coluna e não há ALTER TABLE, exceto para adicionar e eliminar colunas.
A outra desvantagem é que todo o banco de dados é bloqueado por qualquer transação que requeira acesso de gravação.
Etapa 2 - Construtor de Tabela
Assim que a conexão com o banco de dados for estabelecida, podemos usar o define_table método para definir novas tabelas.
Por exemplo -
db.define_table('invoice',Field('name'))
O método acima também é usado entre o construtor de tabela. A sintaxe do construtor de tabela é a mesma. O primeiro argumento é o nome da tabela, e é seguido por uma lista deField(s). O construtor de campo recebe os seguintes argumentos -
Sr. Não | Argumentos e uso |
---|---|
1 | The field name Nome do campo na tabela. |
2 | The field type assume valores com qualquer um dos tipos de dados, como string (padrão), texto, booleano, inteiro e assim por diante. |
3 | Length Define o comprimento máximo. |
4 | default = None Este é o valor padrão quando um novo registro é inserido. |
5 | update = None Isso funciona da mesma forma que o padrão, mas o valor é usado apenas na atualização, não na inserção. |
6 | Notnull Isso especifica se o valor do campo pode ser NULL ou não. |
7 | readable = True Isso especifica se o campo pode ser lido em formulários ou não. |
8 | writable = True Isso especifica se o campo é gravável em formulários ou não. |
9 | label = "Field Name" Este é o rótulo a ser usado para este campo nos formulários. |
o define_table método também leva três argumentos nomeados -
Sintaxe
db.define_table('....',migrate=True, fake_migrate=False, format = '%(id)s')
migrate = True - Instrui o web2py a criar a tabela se ela não existir ou alterá-la se não corresponder à definição do modelo.
fake_migrate = False - Se o modelo corresponder ao conteúdo da tabela do banco de dados, defina fake_migrate = True, que ajuda web2py a reconstruir os dados.
format = '%(id)s' - Esta é uma string de formato que determina como os registros em uma determinada tabela devem ser representados.
Gerando SQL bruto
Usando DAL, podemos estabelecer uma conexão com o banco de dados e criar novas tabelas e seus campos usando o construtor de tabela e o construtor de campo.
Às vezes, é necessário gerar instruções SQL para estar em conformidade com a saída necessária. web2py inclui várias funções, que ajudam na geração de SQL bruto, que são fornecidas a seguir -
_inserir
Ajuda a buscar instruções de inserção para a tabela fornecida. Por exemplo,
print db.person._insert(name ='ABC')
Ele irá recuperar a instrução de inserção para a tabela chamada “pessoa”.
Saída de instrução SQL -
INSERT INTO person(name) VALUES ('ABC');
_contagem
Ajuda na busca da instrução SQL, que dá a contagem de registros. Por exemplo, considere uma tabela chamada 'pessoa' e precisamos encontrar a contagem de pessoas com o nome 'ABC'.
print db(db.person.name ==' ABC ')._count()
Saída de instrução SQL -
SELECT count(*) FROM person WHERE person.name = ' ABC ';
_select
Ajuda na busca de instruções SQL selecionadas. Por exemplo, considere uma tabela chamada 'pessoa' e precisamos encontrar a lista de pessoas com o nome 'ABC'.
print db(db.person.name == ' ABC ')._select()
Saída de instrução SQL -
SELECT person.name FROM person WHERE person.name = ' ABC ';
_excluir
Isso ajuda a buscar o delete SQLafirmações. Por exemplo, considere a tabela chamada 'pessoa' e precisamos deletar as instruções com o nome 'ABC'
print db(db.person.name == ' ABC ')._delete()
Saída de instrução SQL -
DELETE FROM person WHERE person.name = ' ABC ';4
_atualizar
Ajuda a buscar instruções SQL atualizadas. Por exemplo, considere a tabela chamada 'pessoa' e precisamos atualizar um nome de coluna com algum outro valor.
print db(db.person.name == ' ABC ')._update()
Saída de instrução SQL -
UPDATE person SET WHERE person.name = ’Alex’;
Problemas com DAL (Gotchas)
SQLite
SQLite não tem o suporte para eliminar ou alterar as colunas. A exclusão de um campo da tabela o mantém ativo no banco de dados, por isso o web2py não saberá das alterações feitas.
Neste caso, é necessário definir o fake_migrate = True o que ajudará a redefinir os metadados de forma que quaisquer alterações, como alterar ou excluir, sejam mantidas sob o conhecimento de web2py.
SQLite não oferece suporte a tipos booleanos. Para isso, web2py mapeia internamente os Booleanos para 1 string de caracteres, com 'T' e 'F' representandotrue e False respectivamente.
MySQL
O MySQL não suporta o recurso ALTER TABLE. Portanto, a migração do banco de dados envolve vários commits. Esta situação pode ser evitada definindo o parâmetrofake_migrate = True ao definir o banco de dados, que manterá todos os metadados.
Oráculo
A Oracle não suporta o recurso de paginação de registros. Também não tem suporte para as palavras-chave OFFSET ou limit. Para isso, o web2py consegue a paginação com a ajuda de uma seleção aninhada de três vias complexa de DAL. O DAL precisa lidar com a paginação por conta própria, se o banco de dados Oracle tiver sido usado.