- accueil CHATA - exemples - Documentation - Tranche
- Résumé
- PONX - PLUIE - MClaveau
|
CHATA (Champs & Tables)
Micro SGBD purement Python, en mémoire
Informations avant de commencer
CHATA est orienté champs.
Les champs utilisent les identificateurs standards de Python (les variables).. En conséquence, ils ne doivent pas comporter d'espaces, d'accents, de caractères non-ascii, de guillemets, etc.
De plus, chaque identifiant, dans CHATA doit être unique.Si un champ doit figuer dans plusieurs tables différentes, il faudra leur attribuer des identifiants différents.
Une table permettent de :
- regrouper plusieurs champ, en un enregistrement
- chaque enregistrement des composé d'un identifiant, le recno, et d'une liste de données.
- tous les enregistrements d'une table doivent avoir le même nombre d'éléments (listes de même longueur)
- conserver les données dans un ensemble d'enregistrements
- sauvegarder les données (ensemble des enregsitrements) sur disque, et les relire
Une sélection contient un ensemble d'enregistrements (les recno en pratique), extraits par différents moyens.
Une base est simplement un regroupement de tables, sur lequel on pourra effectuer certaines opérations, globalement.
La structure des tables n'est pas enregistrée sur disque. Elle doit impérativement établie, par programme, avant de travailler sur une base/table (ou avant le chargement de données.
Si la même structure doit être employée dans différents scripts, il peut être intéressant, d'isoler la définition de la structure des tables, dans un script qui pourra être lancé :
- par from XXX import *
- par execfile('XXX.py')
Il appartient aux utilisateurs de veiller à :
- éviter les déclencheurs (triggers) circulaire
- éviter les jointures circulaires
- éviter d'utiliser plus d'une fois chaque champ, dans une table.
- ne pas utiliser de mots-clef, ou de caractères non-ASCII, dans les noms de tables/champs
Les Champs
Tous les champs d'une table doivent être déclarés avant la table.
Un champ se déclare en appelant chata.champ(). Exemples :
- libelle=chata.champ()
- prix=chata.champ()
- famille=chata.champ()
Il existe plusieurs propriétés, que l'on peut affecter (utiliser) lors de la déclaration d'un champ :
- value permet de lire, ou d'écrire, le contenu (la valeur, les données) du champ
- mini force une valeur minimum pour les modifications du contenu du champ
- maxi force une valeur maximum pour les modifications du contenu du champ
- long limite le nombre d'éléments du contenu d'un champ. Nombre de caractères, pour une chaîne ; nombre d'items, pour une liste ou un dictionnaire.
- index=True pour mettre en place un index sur le champ. Les index permettent de retrouver, très vite, un enregistrement donné, ou de faire des sélections sur intervalle ultra-rapides.
- joint=champderéférence pour établir une jointure avec un autre champ (qui doit déjà être déclaré). Notez qu'une jointure ne doit être faite que sur vers champ indexé
- trigbeforeupdate=fonctionperso indique (si et) quelle fonction sera appelée juste avant une modification du contenu du champ.
- trigafterupdate=fonctionperso indique (si et) quelle fonction sera appelée juste avant une modification du contenu du champ.
- uniq=True empêche d'avoir plusieurs fois le même contenu du champ, dans une table. Devrait être utilisé de préférence sur des champs indexé seulement.
Quelques exemples :
article=chata.champ(index=True,uniq=True) codearticle=chata.champ(joint=article) prix=chata.champ(mini=10,maxi=999.99) libellearticle=chata.champ(long=40) quantite=chata.champ(trigafterupdate=miseajourstock)
Il existe également quelques propriétés affectées par CHATA :
- table renvoie sur la table dans laquelle le champ a été utilisé, lors d'une déclaration de table.
- idx pointe sur l'instance de l'index du champ.
- name l'identifiant, sous forme de chaîne (à usage essentiellement de documentation)
- position numéro de la colonne dans l'enregistrement de la table (= indice dans la liste des champs de l'enregistrement)
On a aussi quelques méthodes :
- fromrecord(numero) retourne la valeur (value) du champ, pour un enregistrement de numéro donné.
- contrainte(valeur) teste si valeur respecte les contraintes mini maxi et long ; returne 0 (respecte) ou 1 (ne respecte pas)
Les Tables
Avant de déclarer une table, il faut avoir ouvert une base.
Une table se déclare en appelant chata.table( champ1, champ2, champ3, ... ). Exemples :
- tarticle=chata.table(codearticle, libelle, famille, prix, stockmini)
- tcomptes=chata.table(compte, descriptif, debit, credit, solde)
Il existe plusieurs propriétés, que l'on peut affecter (utiliser) lors de la déclaration d'un champ :
- base indique à quelle base (groupe de tables) on affecte la table. Facultatif ; par défautn, utilise la dernière base ouverte
- fichier force un nom de fichier, pour l'enregistrement des données. Par défaut, utilise lel'identifiant, en ajoutant ".cdb"
Il existe également quelques propriétés affectées par CHATA :
- recno contient le numéro d'enregistrement courant.
- idxd dictionnaire des index des champs de la table
- champd dictionnaire des champs de de la table
- champl liste des champs de la table
- jointd dictionnaire des jointures des champs de de la table
- name l'identifiant, sous forme de chaîne (à usage essentiellement de documentation)
- nbcol nombre de champs dans l'enregistrement
On a aussi des méthodes :
- infojoint() liste les jointures de la table
- infotable() liste quelques informations sur la table
- infochamp() liste les champs de la table
- charge() lit sur disque les données précédement enregistrées (dans le fichier)
- rollback() synonyme de charge()
- enregistre() écrit les données sur disque (dans le fichier)
- commit() synonyme de enregistre()
- alter() permet d'ajouter ou de supprimer un champ dans une table.
- triggerbeforeinsert() appel d'une fonction personnalisée, avant insertion d'un nouvel enregistrement (non implémenté pour l'instant, et ça fait peut-être double emploi avec les triggers de champs)
- triggerbeforedelete() appel d'une fonction personnalisée, avant suppression d'un enregistrement (non implémenté pour l'instant, mais ce sera fait bienôt)
- triggerafterdelete() appel d'une fonction personnalisée, après suppression d'un enregistrement (non implémenté pour l'instant, mais ce sera fait bienôt)
- moveto() va sur un enregistrement donné (toutes les jointures seront automatiquement mises à jour
- set(num,list) permet d'affecter une liste de valeurs à l'enregistrement num. Les champs sont affectés en parcourant la liste depuis le début, selon un ordre similaire à celui de la déclaration de la table. Tous les évènements de champs (déclencheurs, contraintes) sont traités. Si num n'existait pas, set() réalisera l'insertion d'un nouvel enregistrement.
- append() détermine un recno qui n'existe pas, et l'utilise dans un set().; autrement dit, c'est similaire à set(), faut que ça crée un nouvel enregistrement.
- delete() supprime un enregistrement ; tous les champs ont d'abord leur contenu mis à None, afin de (bien) traiter les déclencheurs.
- reindex(champ) recrée un index
- reindexall() recrée tous les index des champs d'une table. Les index n'étant pas enregistrés, cette méthode est appelée, lors du chargement d'une table.
- visu(num) print (visualise) le contenu des champs d'un enregistrement (ou de l'enregistrement courant, si num est omis)
- visuall() print (visualise) le contenu des champs de tous les enregistrements
- cmax(champ) retourne la valeur maximale, pour ce champ, pour toute la table
- cmin(champ) retourne la valeur minimale, pour ce champ, pour toute la table
- csum(champ) retourne la valeur sommée, pour ce champ, pour toute la table
- cnb(champ) retourne le nombre de ligne de la table
- selection(champ, *compar=valeur) retourne une sélection, en utilisant le champ comme critère, compar comme mode de comparaison, et valeur la valeur comparée. Avec :
EQU égal à NEQ non égal à (différent de) LSS inférieur à LEQ inférieur ou égal à GTR supérieur à GEQ supérieur ou égal à il peut y avoir plusieurs comparaisons (exemple : tarticle.selection(prix, GEQ=100, LSS=1000)
- selectioninterval(champ, mini, maxi) retourne une sélection, dont les valeurs du champ sont mini>= et <= maxi
- idxinterval(champ, mini, maxi) comme selectiointerval, mais en utilisant un index (ultra-rapide)
- selectionjointure(champ, selection) retourne une sélection, utilisant, comme critère, un champ avec jointure, et dont les valeurs du champ sont contenus dans une autre sélection, dans le champ de jointure (sélection sur jointure externe). Cela revient à une intersection entre une première sélection, sur un champ de référence, et un champ
La suite bientôt... |