- 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...