Web2py - Capa de abstracción de base de datos

los Database Abstraction Layer (DAL)se considera como la mayor fortaleza de web2py. El DAL expone una interfaz de programación de aplicaciones (API) simple a la sintaxis SQL subyacente.

En este capítulo, conoceremos las aplicaciones no triviales de DAL, como la construcción de consultas para buscar por etiquetas de manera eficiente y la construcción de un árbol de categorías jerárquicas.

Algunas características importantes de DAL son:

  • web2py incluye una capa de abstracción de base de datos (DAL), una API que asigna objetos de Python a objetos de base de datos. Los objetos de la base de datos pueden ser consultas, tablas y registros.

  • El DAL genera dinámicamente el SQL en tiempo real utilizando el dialecto especificado para el back-end de la base de datos, por lo que no es obligatorio que un desarrollador escriba una consulta SQL completa.

  • La principal ventaja de usar DAL es que las aplicaciones serán portátiles con diferentes tipos de bases de datos.

Introducción a DAL

La mayoría de las aplicaciones de web2py requieren una conexión a la base de datos. Por lo tanto, construir el modelo de base de datos es el primer paso en el diseño de una aplicación.

Considere la aplicación recién creada llamada “helloWorld”. La base de datos se implementa bajo los Modelos de la aplicación. Todos los modelos para la aplicación respectiva están incluidos en el archivo denominado -models/db_custom.py.

Los siguientes pasos se utilizan para implementar DAL:

Paso 1 - Constructor DAL

Establezca una conexión a la base de datos. Esto se crea usando el objeto DAL que también se llama constructor DAL.

db = DAL ('sqlite://storage.sqlite')

La característica notable de DAL es que permite múltiples conexiones con la misma base de datos o con diferentes bases de datos, incluso con diferentes tipos de base de datos. Se observa que esta línea ya está en el archivo.models/db.py. Por lo tanto, es posible que no lo necesite, a menos que lo haya eliminado o necesite conectarse a una base de datos diferente. De forma predeterminada, web2py se conecta a una base de datos SQLite almacenada en un archivostorage.sqlite.

Este archivo se encuentra en la carpeta de bases de datos de la aplicación. Si el archivo está ausente, web2py lo crea cuando se ejecuta la aplicación por primera vez.

SQLite es rápido y almacena todos los datos en un solo archivo. Esto significa que sus datos se pueden transferir fácilmente de una aplicación a otra. De hecho, web2py empaqueta la (s) base de datos (s) SQLite junto con las aplicaciones. Proporciona soporte SQL completo, incluidas traducciones, uniones y agregados.

Hay dos desventajas de SQLite.

  • Una es que no aplica tipos de columna y no hay ALTER TABLE excepto para agregar y eliminar columnas.

  • La otra desventaja es que toda la base de datos está bloqueada por cualquier transacción que requiera acceso de escritura.

Paso 2: constructor de tablas

Una vez establecida la conexión con la base de datos, podemos usar el define_table método para definir nuevas tablas.

Por ejemplo

db.define_table('invoice',Field('name'))

El método anterior también se usa entre el constructor de tablas. La sintaxis del constructor de tablas es la misma. El primer argumento es el nombre de la tabla y le sigue una lista deField(s). El constructor de campo toma los siguientes argumentos:

No Señor Argumentos y uso
1

The field name

Nombre del campo en la tabla.

2

The field type

toma valores que tienen cualquiera de los tipos de datos, como cadena (predeterminado), texto, booleano, entero, etc.

3

Length

Define la longitud máxima.

4

default = None

Este es el valor predeterminado cuando se inserta un nuevo registro.

5

update = None

Esto funciona igual que el predeterminado, pero el valor se usa solo en la actualización, no en la inserción.

6

Notnull

Esto especifica si el valor del campo puede ser NULL o no.

7

readable = True

Esto especifica si el campo es legible en formularios o no.

8

writable = True

Esto especifica si el campo se puede escribir en formularios o no.

9

label = "Field Name"

Esta es la etiqueta que se utilizará para este campo en los formularios.

los define_table El método también toma tres argumentos con nombre:

Sintaxis

db.define_table('....',migrate=True, fake_migrate=False, format = '%(id)s')
  • migrate = True - Esto indica a web2py que cree la tabla si no existe, o que la modifique si no coincide con la definición del modelo.

  • fake_migrate = False - Si el modelo coincide con el contenido de la tabla de la base de datos, establezca fake_migrate = True, que ayuda a web2py a reconstruir los datos.

  • format = '%(id)s' - Esta es una cadena de formato que determina cómo se deben representar los registros en la tabla dada.

Generación de SQL sin formato

Usando DAL, podemos establecer una conexión a la base de datos y crear nuevas tablas y sus campos usando el constructor de tablas y el constructor de campos.

A veces, es necesario generar sentencias SQL para ajustarse a la salida necesaria. web2py incluye varias funciones, que ayudan a generar SQL sin procesar, que se proporcionan de la siguiente manera:

_insertar

Ayuda a obtener declaraciones de inserción para la tabla dada. Por ejemplo,

print db.person._insert(name ='ABC')

Recuperará la declaración de inserción para la tabla denominada "persona".

Salida de declaración SQL -

INSERT INTO person(name) VALUES ('ABC');

_contar

Ayuda a obtener la declaración SQL, que proporciona el recuento de registros. Por ejemplo, considere una tabla llamada 'persona' y necesitamos encontrar el recuento de personas con el nombre 'ABC'.

print db(db.person.name ==' ABC ')._count()

Salida de declaración SQL -

SELECT count(*) FROM person WHERE person.name = ' ABC ';

_Seleccione

Ayuda a buscar sentencias SQL seleccionadas. Por ejemplo, considere una tabla llamada 'persona' y necesitamos encontrar la lista de personas con el nombre 'ABC'.

print db(db.person.name == ' ABC ')._select()

Salida de declaración SQL -

SELECT person.name FROM person WHERE person.name = ' ABC ';

_Eliminar

Ayuda a buscar el delete SQLdeclaraciones. Por ejemplo, considere una tabla llamada 'persona' y necesitamos eliminar las declaraciones con el nombre 'ABC'

print db(db.person.name == ' ABC ')._delete()

Salida de declaración SQL -

DELETE FROM person WHERE person.name = ' ABC ';4

_actualizar

Ayuda a obtener declaraciones SQL actualizadas. Por ejemplo, considere una tabla llamada 'persona' y necesitamos actualizar el nombre de una columna con algún otro valor.

print db(db.person.name == ' ABC ')._update()

Salida de declaración SQL -

UPDATE person SET WHERE person.name = ’Alex’;

Problemas con DAL (Gotchas)

SQLite

SQLite carece del soporte de eliminar o alterar las columnas. Eliminar un campo de la tabla lo mantiene activo en la base de datos, por lo que web2py no se dará cuenta de los cambios realizados.

En este caso, es necesario configurar el fake_migrate = True lo que ayudará a redefinir los metadatos de modo que cualquier cambio, como alterar o eliminar, se mantendrá bajo el conocimiento de web2py.

SQLite no admite tipos booleanos. Para esto, web2py mapea internamente los valores booleanos a una cadena de caracteres, con 'T' y 'F' representandotrue y False respectivamente.

MySQL

MySQL no es compatible con la función ALTER TABLE. Por lo tanto, la migración de la base de datos implica múltiples confirmaciones. Esta situación se puede evitar configurando el parámetrofake_migrate = True mientras se define la base de datos, que conservará todos los metadatos.

Oráculo

Oracle no admite la función de paginación de registros. También carece del soporte para las palabras clave OFFSET o limit. Para esto, web2py logra la paginación con la ayuda de una compleja selección anidada de tres vías de DAL. DAL necesita manejar la paginación por sí solo, si se ha utilizado la base de datos Oracle.