Web2py - Couche d'abstraction de base de données

le Database Abstraction Layer (DAL)est considéré comme la force majeure de web2py. La DAL expose une interface de programmation d'applications (API) simple à la syntaxe SQL sous-jacente.

Dans ce chapitre, nous apprendrons à connaître les applications non triviales de DAL, telles que la création de requêtes pour rechercher efficacement par balises et la construction d'une arborescence de catégories hiérarchique.

Certaines caractéristiques importantes de DAL sont:

  • web2py inclut une couche d'abstraction de base de données (DAL), une API qui mappe les objets Python en objets de base de données. Les objets de la base de données peuvent être des requêtes, des tables et des enregistrements.

  • Le DAL génère dynamiquement le SQL en temps réel en utilisant le dialecte spécifié pour le back-end de la base de données, de sorte qu'il n'est pas obligatoire pour un développeur d'écrire une requête SQL complète.

  • Le principal avantage de l'utilisation de DAL est que les applications seront portables avec différents types de bases de données.

Premiers pas avec DAL

La plupart des applications de web2py nécessitent une connexion à la base de données. Par conséquent, la création du modèle de base de données est la première étape de la conception d'une application.

Considérez l'application nouvellement créée nommée “helloWorld”. La base de données est implémentée sous les modèles de l'application. Tous les modèles pour l'application respective sont compris dans le fichier nommé -models/db_custom.py.

Les étapes suivantes sont utilisées pour implémenter DAL -

Étape 1 - Constructeur DAL

Établissez une connexion à la base de données. Ceci est créé à l'aide de l'objet DAL qui est également appelé le constructeur DAL.

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

La caractéristique notable de DAL est qu'il permet plusieurs connexions avec la même base de données ou avec différentes bases de données, même avec différents types de base de données. On constate que cette ligne est déjà dans le fichiermodels/db.py. Par conséquent, vous n'en aurez peut-être pas besoin, sauf si vous l'avez supprimé ou devez vous connecter à une autre base de données. Par défaut, web2py se connecte à une base de données SQLite stockée dans un fichierstorage.sqlite.

Ce fichier se trouve dans le dossier des bases de données de l'application. Si le fichier est absent, il est créé par web2py lors de la première exécution de l'application.

SQLite est rapide et stocke toutes les données dans un seul fichier. Cela signifie que vos données peuvent être facilement transférées d'une application à une autre. En fait, la ou les bases de données SQLite sont empaquetées par web2py avec les applications. Il fournit une prise en charge SQL complète, y compris les traductions, les jointures et les agrégats.

Il existe deux inconvénients de SQLite.

  • La première est qu'il n'applique pas les types de colonnes et qu'il n'y a pas d'ALTER TABLE sauf pour l'ajout et la suppression de colonnes.

  • L'autre inconvénient est que toute la base de données est verrouillée par toute transaction nécessitant un accès en écriture.

Étape 2 - Constructeur de table

Une fois la connexion avec la base de données établie, nous pouvons utiliser le define_table méthode pour définir de nouvelles tables.

Par exemple -

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

La méthode ci-dessus est également utilisée dans le constructeur de table. La syntaxe du constructeur de table est la même. Le premier argument est le nom de la table, et il est suivi d'une liste deField(s). Le constructeur de champ prend les arguments suivants -

Sr. Non Arguments et utilisation
1

The field name

Nom du champ dans la table.

2

The field type

prend des valeurs ayant l'un des types de données tels que chaîne (par défaut), texte, booléen, entier, etc.

3

Length

Définit la longueur maximale.

4

default = None

Il s'agit de la valeur par défaut lorsqu'un nouvel enregistrement est inséré.

5

update = None

Cela fonctionne de la même manière que par défaut, mais la valeur est utilisée uniquement lors de la mise à jour, pas lors de l'insertion.

6

Notnull

Cela spécifie si la valeur du champ peut être NULL ou non.

sept

readable = True

Cela spécifie si le champ est lisible dans les formulaires ou non.

8

writable = True

Cela spécifie si le champ est accessible en écriture dans les formulaires ou non.

9

label = "Field Name"

Il s'agit de l'étiquette à utiliser pour ce champ dans les formulaires.

le define_table La méthode prend également trois arguments nommés -

Syntaxe

db.define_table('....',migrate=True, fake_migrate=False, format = '%(id)s')
  • migrate = True - Cela demande à web2py de créer la table si elle n'existe pas, ou de la modifier si elle ne correspond pas à la définition du modèle.

  • fake_migrate = False - Si le modèle correspond au contenu de la table de la base de données, définissez fake_migrate = True, ce qui aide web2py à reconstruire une donnée.

  • format = '%(id)s' - Il s'agit d'une chaîne de format qui détermine la façon dont les enregistrements de la table donnée doivent être représentés.

Générer du SQL brut

En utilisant DAL, nous pouvons établir une connexion à la base de données et créer de nouvelles tables et leurs champs en utilisant le constructeur de table et le constructeur de champ.

Parfois, il est nécessaire de générer des instructions SQL pour se conformer à la sortie nécessaire. web2py comprend diverses fonctions, qui aident à générer du SQL brut, qui sont données comme suit -

_insérer

Cela aide à récupérer les instructions d'insertion pour la table donnée. Par exemple,

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

Il récupérera l'instruction d'insertion pour la table nommée «personne».

Sortie de l'instruction SQL -

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

_compter

Il aide à récupérer l'instruction SQL, qui donne le nombre d'enregistrements. Par exemple, considérons une table nommée «personne» et nous devons trouver le nombre de personnes portant le nom «ABC».

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

Sortie de l'instruction SQL -

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

_sélectionner

Il aide à récupérer des instructions SQL sélectionnées. Par exemple, considérons une table nommée «personne» et nous devons trouver la liste des personnes portant le nom «ABC».

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

Sortie de l'instruction SQL -

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

_effacer

Cela aide à récupérer le delete SQLdéclarations. Par exemple, considérez la table nommée «personne» et nous devons supprimer les instructions portant le nom «ABC»

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

Sortie de l'instruction SQL -

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

_mettre à jour

Il aide à récupérer les instructions SQL mises à jour. Par exemple, considérez la table nommée «personne» et nous devons mettre à jour un nom de colonne avec une autre valeur.

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

Sortie de l'instruction SQL -

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

Problèmes avec DAL (Gotchas)

SQLite

SQLite ne prend pas en charge la suppression ou la modification des colonnes. La suppression d'un champ de la table le maintient actif dans la base de données, car web2py ne sera pas au courant des modifications apportées.

Dans ce cas, il est nécessaire de régler le fake_migrate = True ce qui aidera à redéfinir les métadonnées de telle sorte que tout changement tel que modifier ou supprimer sera conservé à la connaissance de web2py.

SQLite ne prend pas en charge les types booléens. Pour cela, web2py mappe en interne les booléens à 1 chaîne de caractères, avec 'T' et 'F' représentanttrue et False respectivement.

MySQL

MySQL ne prend pas en charge la fonction ALTER TABLE. Ainsi, la migration de la base de données implique plusieurs commits. Cette situation peut être évitée en réglant le paramètrefake_migrate = True lors de la définition de la base de données, qui conservera toutes les métadonnées.

Oracle

Oracle ne prend pas en charge la fonction de pagination des enregistrements. Il manque également le support des mots-clés OFFSET ou limit. Pour cela, web2py réalise la pagination à l'aide d'une sélection complexe imbriquée à trois voies de DAL. DAL doit gérer la pagination seul, si la base de données Oracle a été utilisée.