Aller au contenu

Des pages avec SQL

Des exemples sur le site modĂšle : Page avec SQL du site modĂšle

I. Avant de commencer⚓

La structure du site

Dans le fichier mkdocs.yml vers la ligne 125, dans plugins il doit y avoir - sqlite-console absolument aprĂšs : - pyodide_macros

Sous plugins

  • Dans le fichier .gitlab-ci.yml environ Ă  partir de la ligne 15, modifier si nĂ©cessaire pour avoir ceci :

    build:
    stage: build
    before_script:
        - python -m venv .venv
        - source .venv/bin/activate
        - pip install --upgrade pip
        - pip install -r requirements.txt
    

  • Dans le fichier requirements.txt ajouter la derniĂšre ligne

Fichier requirements.txt
pyodide-mkdocs-theme
mkdocs-awesome-pages-plugin
mkdocs-enumerate-headings-plugin
mkdocs-exclude-search
mkdocs-sqlite-console
  • dans le fichier xtra/stylsheets/ajustements.css ajouter Ă  la fin :
    /*
    Pour cacher le div vide avec les erreurs s’il y en a lorsqu'on exĂ©cute du code cachĂ© en SQL
    */
    div.sqlhidden > * {
        display: none;
        }
    

Syntaxe pour utiliser un IDE avec SQL

Remarque : ancienne syntaxe utilisées avec une version de PMT antérieure à Pyodide-MkDocs-Theme v.4.4.6

Cette ancienne syntaxe reste compatible avec les versions suivante de PMT, mais il est recommandé d'utiliser la nouvelle syntaxe.

Ancienne syntaxe
{!{ sqlide titre="essai" espace="page_sql"}!}

Comme précisé dans la documentation, on peut depuis Pyodide-MkDocs-Theme v.4.4.6 utiliser la syntaxe suivante :

{{ sqlide(titre="essai", espace="page_sql") }}

La syntaxe

  • Noter les parenthĂšses autour des arguments,
  • Noter des virgules entre les arguments,
  • Noter que les guillemets autour des valeurs des arguments sont indispensables.

Le paramĂštre espace

Utiliser le mĂȘme argument pour le paramĂštre espace dans diffĂ©rents IDE permet de rendre accessible dans tous les IDE ayant le mĂȘme argument (par exemple espace="exercice_mediatheque") les bases de donnĂ©es créées, tables créées, modifiĂ©es etc.
⚠ C'est indispensable pour des IDE correspondant Ă  diffĂ©rentes questions portant sur la mĂȘme base, ou pour un exercice dont les questions s'enchainent.

Attention : Intégrité des contraintes de clef étrangÚre

Par dĂ©faut SQLite ne vĂ©rifie pas l’intĂ©gritĂ© des contraintes de clef Ă©trangĂšres. Il faut lui dire explicitement de le faire avec le code suivant :
PRAGMA foreign_keys=1;

Il est possible de rajouter ce code :

Chemins

Comme pour les exerccies avec des IDE Python, les chemins sont relatifs depuis le fichier .md en cours

Documentation officielle

Se reporter ici : documentation

Remarque

Ce qui est au dĂ©but de cette documentation donnĂ©e en lien ne correspond pas aux sites créés avec PMT (comme ce tutoriel ou le site modĂšle associĂ©). De mĂȘme ne pas tenir compte de la fin de la documentation (Dans le cas de l'utilisation du plugin des macros seul, avec un ajout Ă  faire dans le fichier main.py).

II. DĂ©tail des syntaxes avec des exemples⚓

Créer un IDE SQL vide

code Ă  copier
{{ sqlide(titre="Votre code SQL", espace="exercices_sql") }}



Créer un IDE SQL avec du code prérempli

code Ă  copier
{{ sqlide(titre="tester SQL avec du code pré-saisi", sql="sql/code_1.sql", espace="exercices_sql") }}



Le fichier code_1.sql
-- les tirets permettent d'insérer des commentaires
DROP TABLE IF EXISTS eleves; -- notez bien ce ; en fin de chaque bloc d'instructions
CREATE TABLE eleves (
    id INTEGER PRIMARY KEY ,  
    nom TEXT NOT NULL ,
    prenom TEXT NOT NULL ,
    date_naiss DATE FORMAT 'dd.mm.yyyy' NOT NULL , 
    classe TEXT NOT NULL ,
    nb_heures INTEGER

); -- notez bien de nouveau ce ;
Syntaxe simplifiée si les trois options titre, sql et espace sont présentes

On peut dans ce cas-lĂ  en gardant le mĂȘme ordre ne pas Ă©crire le nom des options :

code Ă  copier
{{ sqlide("tester SQL avec du code pré-saisi", "sql/code_1.sql", "exercices_sql") }}



Créer un IDE avec du code caché

Ci-dessous le code du fichier caché donné par init= :

Fichier init_1.sql
-- Pour la vérification de l'intégrité des contraintes de clé étrangÚre : 
PRAGMA foreign_keys=1;

-- Pour créer la table
DROP TABLE IF EXISTS employees;
CREATE TABLE employees
(
    id          integer,
    name        text,
    designation text,
    manager     integer,
    hired_on    date,
    salary      integer,
    commission  float,
    dept        integer
);

INSERT INTO employees VALUES (1,'JOHNSON','ADMIN',6,'1990-12-17',18000,NULL,4);
INSERT INTO employees VALUES (2,'HARDING','MANAGER',9,'1998-02-02',52000,300,3);
INSERT INTO employees VALUES (3,'TAFT','SALES I',2,'1996-01-02',25000,500,3);
INSERT INTO employees VALUES (4,'HOOVER','SALES I',2,'1990-04-02',27000,NULL,3);
INSERT INTO employees VALUES (5,'LINCOLN','TECH',6,'1994-06-23',22500,1400,4);
INSERT INTO employees VALUES (6,'GARFIELD','MANAGER',9,'1993-05-01',54000,NULL,4);
code Ă  copier
{{ sqlide(titre="init + code", sql="sql/code_sql.sql", espace="exercices_sql", init="sql/init_1.sql") }}



Syntaxe simplifiée si les trois options titre, sql et espace sont présentes

On peut dans ce cas-lĂ  en gardant le mĂȘme ordre ne pas Ă©crire le nom des trois premiĂšres options :

code Ă  copier
{{ sqlide("init + code", "sql/code_sql.sql", "exercices_sql", init="sql/init_1.sql") }}



Créer un IDE avec un fichier SQL caché exécuté automatiquement et une base de donnée cachée chargée automatiquement

Depuis la version 2.1.0 de mkdocs-sqlite-console base et init peuvent ĂȘtre utilisĂ©s ensemble. Si les arguments base et init sont tous les deux utilisĂ©s, la base est chargĂ©e avant que le code du fichier init ne soit exĂ©cutĂ©.

fichier init_integrite.sql
PRAGMA foreign_keys=1;
code Ă  copier pour un exemple d'exercice
???+ question "Exercice avec plusieurs questions"

    **Question 1 :** Combien de livres contiennent la chaßne 'Astérix' dans leur titre ?

    {{ sqlide(titre="", sql="sql/asterix_q1.sql", espace="mediatheque", base="bases/Livres.db", init="sql/init_integrite.sql") }}

    ??? success "Solution"

        {{ sqlide(titre="", sql="sql/asterix.sql", espace="mediatheque", base="bases/Livres.db", init="sql/init_integrite.sql") }}

    **Question 2 :** Peut-on supprimer n’importe quel enregistrement ?  
    Essayons de supprimer le livre "Hacker's Delight" sachant que son code ISBN est 978-0201914658.

    {{ sqlide(titre="", sql="sql/exemple.sql", espace="mediatheque", base="bases/Livres.db", init="sql/init_integrite.sql") }}

    ??? success "Solution"
        Le SGBD nous indique que supprimer ce livre, violerait la contrainte de clé étrangÚre.  
        En effet, le code isbn est une clé étrangÚre dans la table `auteur_de`.
Exercice avec plusieurs questions

Question 1 : Combien de livres contiennent la chaßne 'Astérix' dans leur titre ?



Solution



Question 2 : Peut-on supprimer n’importe quel enregistrement ?
Essayons de supprimer le livre "Hacker's Delight" sachant que son code ISBN est 978-0201914658.



Solution

Le SGBD nous indique que supprimer ce livre, violerait la contrainte de clé étrangÚre.
En effet, le code isbn est une clé étrangÚre dans la table auteur_de.

Avec les versions antérieures

⚠ Avant la version 2.1.0 de mkdocs-sqlite-console base et init ne pouvaient pas ĂȘtre utilisĂ©s en mĂȘme temps.

Dans l'exemple suivant :

  • le code cachĂ© SQL du fichier pointĂ© par la paramĂštre sql (fichier option.sql) est auto-exĂ©cutĂ© grĂące au paramĂštre autoexec=True. Souvenons nous qu' avec SQLite utilisĂ© sur ce site l'instruction PRAGMA foreign_keys=1; est nĂ©cessaire pour l'intĂ©gritĂ© de contrainte de clĂ© Ă©trangĂšre.
  • la base de donnĂ©e livres est chargĂ©e de façon cachĂ©e grĂące au paramĂštre hide=True
fichier option.sql
PRAGMA foreign_keys=1;
code Ă  copier pour un exemple d'exercice
???+ question "Exercice avec plusieurs questions"


    {{ sqlide(titre="avec base Livres", sql="sql/option.sql", espace="mediatheque_2", base="bases/Livres.db", autoexec=True, hide=True) }}


    **Question 1 :** Combien de livres contiennent la chaßne 'Astérix' dans leur titre ?

    {{ sqlide(titre="", sql="sql/asterix_q1.sql", espace="mediatheque_2") }}

    ??? success "Solution"

        {{ sqlide(titre="", sql="sql/asterix.sql", espace="mediatheque_2") }}

    **Question 2 :** Peut-on supprimer n’importe quel enregistrement ?  
    Essayons de supprimer le livre "Hacker's Delight" sachant que son code ISBN est 978-0201914658.

    {{ sqlide(titre="", sql="sql/exemple.sql", espace="mediatheque_2") }}

    ??? success "Solution"
        Le SGBD nous indique que supprimer ce livre, violerait la contrainte de clé étrangÚre.  
        En effet, le code isbn est une clé étrangÚre dans la table `auteur_de`.
Exercice avec plusieurs questions



Question 1 : Combien de livres contiennent la chaßne 'Astérix' dans leur titre ?



Solution



Question 2 : Peut-on supprimer n’importe quel enregistrement ?
Essayons de supprimer le livre "Hacker's Delight" sachant que son code ISBN est 978-0201914658.



Solution

Le SGBD nous indique que supprimer ce livre, violerait la contrainte de clé étrangÚre.
En effet, le code isbn est une clé étrangÚre dans la table auteur_de.

Exercices en plusieurs versions

On peut mettre des IDE avec SQL dans des volets.

Code Ă  copier
Combien de livres contiennent la chaßne 'Astérix' dans leur titre ?
=== "Version vide"

    {{ sqlide(titre="", espace="mediatheque") }}

=== "Version à compléter"

    {{ sqlide(titre="", sql="sql/exercice_q1.sql", espace="mediatheque") }}

Combien de livres contiennent la chaßne 'Astérix' dans leur titre ?





Signature exacte de la macro sqlide

Voici la déclaration exacte de la macro, et les valeurs par défaut associées aux différents arguments :

🐍 Script Python
sqlide(
    self,
    titre='Sql',
    sql='',
    espace=None,
    *,
    base='/',
    init='',
    hide=False,
    autoexec=False,
)
  • Les trois premiers arguments, titre, sql et espace sont des arguments positionnels avec des valeurs par dĂ©faut : il n'est pas obligatoire de mettre le nom de l'argument (mais dans ce cas, il faut respecter l'ordre de dĂ©claration).

  • Les arguments aprĂšs *, sont des arguments nommĂ©s. Ils doivent impĂ©rativement ĂȘtre renseignĂ©s en prĂ©cisant le nom de l'argument.

  • Il est toujours possible de renseigner les noms des arguments positionnels si on le souhaite (dans ce cas, il n'est pas indispensable de respecter leur ordre dans la dĂ©claration).

Crédit pour la réalisation du plugin mkdocs-sqlite-console et la documentation : Rafaël Lopez

Crédit pour l'adaptation à PMT : Frédéric Zinelli