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.