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.