26. La console miraj-cli
miraj-cli est la console SQL interactive de MIRAJ : elle ouvre un dossier de données (ou se connecte à un serveur démarré, voir 26.7), exécute des instructions SQL et affiche les résultats. Elle sert aussi bien à l'exploration interactive (REPL) qu'à l'exécution de scripts .sql en mode batch (tâches planifiées, migrations, déploiements).
26.1 Syntaxe générale#
miraj-cli [--root <dossier>] [--config <fichier.xml>] [-d <base>] [-e "<SQL>"]
[--lang en|fr|zh|hi|es|ar|pt|ru|de|ja] [--json] [--timing] [--no-history]
[<fichier.sql>]
miraj-cli --host <hôte> [--port <port>] [--user <compte>] [--password]
[--protocol auto|miraj|postgresql] [options TLS] [-d <base>] [-e "<SQL>"]
[--json] [--timing] [--no-history] [<fichier.sql>]Les noms des options de la console embarquée sont insensibles à la casse (--ROOT équivaut à --root) ; les options de connexion (26.7) s'écrivent en minuscules.
Codes de sortie :
| Code | Signification |
|---|---|
0 | Succès (toutes les instructions ont réussi) |
1 | Au moins une instruction a échoué, ou un fichier .sql donné en argument est introuvable |
2 | Erreur à l'ouverture du serveur embarqué (dossier racine, fichier de configuration, dossier déjà ouvert par un autre processus MIRAJ), option de connexion invalide ou connexion au serveur impossible |
26.2 Options de la ligne de commande#
| Option | Description | Exemple |
|---|---|---|
--root <dossier> | Dossier racine des données à ouvrir (défaut : data, créé si absent). Chaque base qu'il contient est chargée à sa première utilisation. | miraj-cli --root C:\donnees\miraj |
--config <fichier.xml> | Fichier de configuration XML du moteur à utiliser, à la place de <dossier racine>\miraj_config.xml. Si le fichier n'existe pas, un modèle commenté est créé à cet endroit ; miraj_default.xml, la liste de référence de toutes les variables avec leur valeur par défaut, est régénéré à chaque démarrage à côté de lui (il n'est jamais lu). | miraj-cli --config C:\conf\miraj-prod.xml |
-d <base> | Base de données à sélectionner après l'ouverture (équivaut à taper USE <base>; en première instruction). | miraj-cli -d shop |
-e "<SQL>" | Exécute l'instruction (ou le script) SQL donné puis quitte, sans entrer dans le REPL. Désactive l'historique. | miraj-cli -d shop -e "SELECT COUNT(*) FROM articles" |
--lang <code> | Langue des messages d'erreur et d'avertissement : en (défaut), fr, zh, hi, es, ar, pt, ru, de, ja. | miraj-cli --lang fr |
--json | Affiche les résultats au format JSON plutôt qu'en tableau texte. Peut aussi être activé en cours de session avec \json. | miraj-cli --json -e "SELECT * FROM articles" |
--timing | Affiche le temps d'exécution de chaque instruction. Peut aussi être activé en cours de session avec \timing. | miraj-cli --timing |
--no-history | Désactive la lecture et l'écriture de l'historique persistant des instructions. | miraj-cli --no-history |
<fichier.sql> | Exécute ce fichier en mode batch puis quitte (repérable à son extension .sql, sans être la valeur de -e). Le dernier argument .sql de la ligne de commande est retenu. | miraj-cli migration.sql |
--help, -h, /? | Affiche le résumé de la syntaxe et quitte. | miraj-cli --help |
Remarques :
-eet<fichier.sql>sont mutuellement prioritaires sur le REPL : si-eest présent, il est exécuté et la console quitte sans lire de fichier ni ouvrir de REPL ; sinon, s'il y a un argument.sql, ce fichier est exécuté ; sinon, le REPL démarre.-d <base>peut se combiner avec-eou avec un fichier.sql: la base est sélectionnée avant l'exécution.- Le fichier
.sqlexécuté peut contenir un BOM UTF-8 en tête, ignoré automatiquement. Sur un dossier de données ouvert par la console, il est exécuté comme un seul lot d'instructions séparées par;, jusqu'à la première erreur (code de sortie1) ; la commandeDELIMITERn'y est pas reconnue (erreur 1064) : un script qui en contient, comme ceux demiraj-dump, se recharge parmiraj-dump restoreou par la console connectée à un serveur (26.7). - La console embarque le moteur : elle ouvre le dossier de données elle-même et en prend le verrou exclusif (
miraj.lck). Tant qu'unmiraj-servertient ce dossier, elle ne peut pas l'ouvrir (code de sortie2) : se connecter alors au serveur avec les options de connexion (26.7).
26.3 Commandes internes du REPL#
Dans le REPL, une instruction SQL peut s'écrire sur plusieurs lignes ; elle est envoyée au moteur dès qu'une ligne se termine par ;. Les commandes suivantes, préfixées par \ pour la plupart, ne sont pas du SQL et s'exécutent immédiatement, sans point-virgule :
| Commande | Rôle | Exemple |
|---|---|---|
\help, \h, help | Affiche la liste des commandes. | \help |
\timing | Bascule l'affichage du temps d'exécution (activé/désactivé). | \timing |
\json | Bascule le format d'affichage des résultats entre tableau et JSON. | \json |
\d | Liste les tables de la base courante (SHOW TABLES). | \d |
\d <table> | Décrit les colonnes de la table donnée (DESCRIBE <table>). | \d articles |
\l | Liste les bases de données du serveur (SHOW DATABASES). | \l |
\history [n] | Affiche les n dernières instructions de l'historique (20 par défaut). Un nombre négatif n'affiche rien. | \history 50 |
\!n | Réexécute l'instruction numéro n de l'historique (numéro affiché par \history). | \!12 |
source <fichier.sql>, \. <fichier.sql> | Exécute un fichier .sql sans quitter le REPL. | source migration.sql |
\q, exit, quit | Quitte la console. | \q |
| flèches haut / bas | Rappel des lignes précédemment saisies (console Windows). | — |
| Ctrl-C | Pendant l'exécution d'une instruction (dossier de données ouvert par la console) : interrompt l'instruction, qui rend l'erreur 1317, sans quitter la console. Hors exécution, Ctrl-C garde son effet habituel. | — |
Exemple d'interruption d'une requête trop longue :
miraj> SET cte_max_recursion_depth = 4294967295;
OK, 0 ligne(s) affectée(s)
miraj> WITH RECURSIVE s(n) AS (SELECT 1 UNION ALL SELECT n+1 FROM s WHERE n < 1000000000) SELECT COUNT(*) FROM s;
ERREUR 1317 (70100) : Query execution was interrupted
miraj> SELECT 2;
+---+
| 2 |
+---+
| 2 |
+---+
1 ligne(s)26.4 Utilisation interactive typique#
> miraj-cli --root C:\donnees\miraj --timing
MIRAJ 1.0.0 Entreprise - tapez \help pour l'aide, \q pour quitter.
miraj> \l
+--------------------+
| Database |
+--------------------+
| information_schema |
| miraj |
| performance_schema |
| shop |
| sys |
+--------------------+
5 ligne(s) (60.08 ms)
miraj> USE shop;
OK, 0 ligne(s) affectée(s) (56.24 ms)
shop> \d
+----------------+
| Tables_in_shop |
+----------------+
| articles |
+----------------+
1 ligne(s) (60.12 ms)
shop> \d articles
+-------+---------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| nom | varchar(50) | NO | | NULL | |
| prix | decimal(10,2) | YES | | NULL | |
| stock | int(11) | YES | | 0 | |
+-------+---------------+------+-----+---------+----------------+
4 ligne(s) (52.23 ms)
shop> SELECT nom, prix
-> FROM articles
-> WHERE prix > 10;
+--------+-------+
| nom | prix |
+--------+-------+
| Cahier | 12.90 |
+--------+-------+
1 ligne(s) (53.49 ms)
shop> \json
Résultats au format JSON
shop> SELECT nom, prix FROM articles WHERE prix > 10;
[
{"nom": "Cahier", "prix": 12.90}
]
1 ligne(s) (58.58 ms)
shop> \qLe prompt affiche la base courante (shop>) ou miraj> si aucune base n'est sélectionnée ; il devient -> pour la poursuite d'une instruction multi-lignes non terminée.
26.5 Exécution de scripts SQL en mode batch#
Trois façons d'exécuter un script sans passer par le REPL interactif :
# Fichier donné en argument : exécuté puis la console quitte
miraj-cli --root C:\donnees\miraj -d shop migration.sql
# Instruction ou script inline avec -e (plusieurs instructions séparées par ;)
miraj-cli --root C:\donnees\miraj -e "USE shop; DELETE FROM articles WHERE stock = 0;"
# Depuis le REPL, sans quitter la session en cours
miraj> source migration.sqlUn code de sortie différent de 0 signale un script en échec ; combiné avec --json, la sortie d'un script exécuté par -e est directement exploitable par un autre programme :
miraj-cli --root C:\donnees\miraj -d shop --json -e "SELECT id, nom FROM articles" > articles.json
if ($LASTEXITCODE -ne 0) { Write-Error "Échec du script" }26.6 Astuces pratiques#
- Historique persistant : chaque instruction validée dans le REPL est ajoutée à
%APPDATA%\MIRAJ\cli-history.sql(ou~/.config/MIRAJ/cli-history.sqlhors Windows), jusqu'à 1000 entrées conservées. Cet historique est relu au démarrage suivant et alimente\historyet\!n.--no-history(ou-e, qui le désactive automatiquement) l'ignore, utile pour des scripts appelés en boucle depuis une tâche planifiée. - Chronométrage :
--timing(ou\timingen cours de session) est utile pour comparer rapidement deux formulations d'une même requête sans instrumenter un client. - Format JSON :
--json(ou\json) facilite le passage des résultats à un autre outil en ligne de commande (ConvertFrom-Jsonen PowerShell,jq, etc.) sans écrire de client dédié. - Fichier de configuration : au premier démarrage,
miraj-cliécrit un modèle commentémiraj_config.xmldans le dossier racine (ou au chemin donné par--config) et régénèremiraj_default.xml, la référence de toutes les variables du moteur. Modifiermiraj_config.xmlpuis relancer la console applique les réglages ; un fichier invalide ou illisible fait quitter la console avec le code2. Contrairement àmiraj-server, la console ne cherche pas demiraj_config.xmlà côté de son exécutable. - Mots de passe : une instruction qui contient un mot de passe ou une clé de chiffrement (
CREATE USER … IDENTIFIED BY,SET PASSWORD, etc.) reste rejouable par\!ndans la session mais n'est jamais écrite dans le fichier d'historique. - Erreurs : une instruction en échec affiche
ERREUR <code> (<SQLSTATE>) : <message>, suivi deposition : ligne L, colonne Cquand l'analyseur la connaît. - Avertissements : les avertissements de la session (troncatures, valeurs par défaut appliquées, etc.) s'affichent après le résultat de chaque instruction qui en a produit.
26.7 Console sur un serveur démarré#
Avec une option de connexion (--host, --port, --user, --password, --protocol, --ssl, --ssl-ca, --ssl-insecure, --no-ssl), la console se connecte au serveur au lieu d'ouvrir un dossier de données (--root, --config et --lang sont alors sans objet ; la langue des messages est celle du serveur).
| Option | Défaut | Description |
|---|---|---|
--host <hôte> | 127.0.0.1 | Serveur à joindre. |
--port <port> | 7007 | Port du serveur. |
--user <compte> | root | Compte de connexion. |
--password (ou --ask-password) | — | Mot de passe demandé au clavier, sans écho. Sans cette option, la variable d'environnement MIRAJ_PASSWORD est lue si elle existe. |
--password=<mot de passe> | — | Déconseillé : visible dans la liste des processus ; la console affiche un avertissement. |
| (aucune option TLS) | TLS proposé | Connexion chiffrée si le serveur propose TLS, certificat non vérifié. |
--ssl | — | TLS exigé, certificat du serveur vérifié (nom d'hôte compris). |
--ssl-ca <fichier.pem> | — | Autorité qui a signé le certificat du serveur (implique --ssl). |
--ssl-insecure | — | TLS exigé, certificat accepté sans vérification. |
--no-ssl | — | Connexion en clair. |
--protocol auto|miraj|postgresql | auto | Langage de l'instance : reconnu à la connexion, ou imposé. |
miraj-cli --port 7007 -d shop
miraj-cli --host 10.0.0.5 --user admin --password --ssl-ca ca.pem migration.sql> miraj-cli --port 7007 -d essai
MIRAJ 1.0.0 - connecté (langage MIRAJ) - tapez \help pour l'aide, \q pour quitter.
essai> SELECT 1 = 1 AS vrai;
+------+
| vrai |
+------+
| 1 |
+------+
1 ligne(s)
essai> SELECT * FROM absente;
ERREUR 1146 (42S02) : Table 'essai.absente' doesn't exist
essai> SELECT CAST('abc' AS SIGNED) AS n;
+---+
| n |
+---+
| 0 |
+---+
1 ligne(s)
Avertissement : Truncated incorrect INTEGER value: 'abc'
essai> \qLa même session sur une instance en langage PostgreSQL :
MIRAJ 1.0.0 - connecté (langage PostgreSQL) - tapez \help pour l'aide, \q pour quitter.
miraj=> SELECT 1 = 1 AS vrai;
+------+
| vrai |
+------+
| t |
+------+
1 ligne(s)
miraj=> SELECT * FROM absente;
ERREUR 42P01 : relation "absente" does not exist
miraj=> \q- Langage de l'instance : reconnu à la connexion (
--protocol auto, défaut ;mirajoupostgresqll'imposent, voir 30.12). Les instructions s'écrivent dans ce langage ; l'invite le montre :base>en langage MIRAJ,base=>en langage PostgreSQL (miraj>/miraj=>sans base courante). - Erreurs :
ERREUR 1146 (42S02) : …en langage MIRAJ,ERREUR 42P01 : …(SQLSTATE) en langage PostgreSQL ; les avertissements et avis suivent le résultat. Seuls ceux que l'instruction a levés elle-même s'affichent, une seule fois : une erreur n'est pas répétée en avertissement, ni après les instructions suivantes. -d <base>: la base est choisie sans rien afficher (la bannière vient en premier) ; une base inconnue affiche l'erreur, et la console rendra le code de sortie1en quittant.- Fichier
.sql: découpé en instructions dans le langage de l'instance (chaînes, commentaires,DELIMITERen langage MIRAJ ; chaînes standard,E'…',$$…$$en langage PostgreSQL), lu au fil de l'eau et exécuté jusqu'à la première erreur (code de sortie1), commemiraj-dump restore, en indiquant la ligne de l'instruction fautive. Un export demiraj-dumpse recharge ainsi.> miraj-cli --port 7007 e.sql OK, 0 ligne(s) affectée(s) ERREUR 1146 (42S02) : Table 'shop.absente' doesn't exist e.sql, ligne 2 - Les commandes
\d,\l,\json,\timing, l'historique etsourcefonctionnent de même ; un résultat booléen s'affichet/fen langage PostgreSQL. - Code de sortie
2: connexion impossible.