Données du service
Interroger et modifier les données d'une base déployée, depuis le terminal.
eqs db exécute une instruction sur une base de données que vous avez déployée depuis la marketplace. C'est l'api qui détient les identifiants, vérifie la permission et enregistre ce qui a été exécuté : rien n'a besoin d'être copié sur votre machine au préalable.
Lecture. C'est le moteur qui garantit qu'il s'agit bien d'une lecture, pas une relecture de votre instruction par nos soins.
eqs db query pg-main "select id, email from users order by id desc"Modifie des lignes : insert, update, delete.
eqs db exec pg-main "delete from sessions where expires_at < now()"Modifie la structure : create, alter, drop. Permission dédiée.
eqs db ddl pg-main "alter table users add column nickname text"Ce que contient le service : tables, collections, ou labels et types de relation.
eqs db tables pg-mainLes colonnes d'une table, les index d'une collection ou les propriétés observées sur un label.
eqs db describe pg-main usersL'instruction est celle du moteur
Il n'y a pas de dialecte commun à apprendre, et c'est délibéré. Un langage qui couvrirait à la fois SQL, les commandes Redis, les documents Mongo et Cypher serait une version dégradée de chacun. Ce qui est uniforme, c'est tout ce qui entoure l'instruction : comment vous désignez le service, quelle permission il faut, comment le résultat revient et ce qui est enregistré.
| Moteur | Instruction | Paramètres |
|---|---|---|
| PostgreSQL | SQL | $1, $2 … |
| MySQL / MariaDB | SQL | ? |
| ClickHouse | SQL | {p1:String} … |
| Redis | une ligne de commande | ajoutés comme arguments |
| MongoDB | un document de commande JSON | aucun — les valeurs sont dans le document |
| Neo4j | Cypher | $p1, $p2 … |
eqs db query cache "LRANGE queue 0 -1" eqs db query docs '{"find":"users","filter":{"active":true},"limit":20}' eqs db query graph "MATCH (p:Person) RETURN p.name AS name LIMIT 10"
Jusqu'où tient la lecture seule
eqs db query ne devine jamais si votre instruction écrit. Lire du SQL pour en
décider est fragile et échoue en laissant passer, alors c'est le moteur qui
tranche — et la sortie vous dit laquelle des trois réponses vous avez obtenue.
| Moteurs | Ce que cela veut dire | |
|---|---|---|
enforced | PostgreSQL, MySQL, ClickHouse, Neo4j | Le moteur refuse lui-même l'écriture, dans une transaction en lecture seule. Rien n'a eu à être détecté |
checked | Redis, MongoDB | Le moteur a classé la commande et nous refusons d'après sa réponse. Ce n'est toujours pas une supposition sur votre instruction, mais cela peut laisser passer ce qu'une transaction aurait bloqué |
declared | — | Le verbe était une déclaration et c'est l'enregistrement d'audit qui en répond |
checked : un aggregate MongoDB qui se termine par $out ou $merge écrit, alors que MongoDB classe aggregate comme une lecture. L'attraper supposerait d'interpréter le pipeline, c'est-à-dire précisément la supposition que cette conception évite — c'est donc écrit ici plutôt que balayé sous le tapis.Permissions
Chaque verbe exige son action, et elles ne se remplacent pas.
| Verbe | Exige | Qui l'a |
|---|---|---|
query, tables, describe | data.read | Reader, Contributor, Owner |
exec | data.write | Contributor, Owner |
ddl | data.ddl | Owner |
data.ddl est séparé de data.write à dessein : modifier une ligne et
supprimer une table ne présentent pas le même risque, et qui peut faire le
premier ne devrait pas faire le second sans y penser.
Valeurs, limites et trace
--param au collage d'une valeur dans l'instruction. Elle est liée par le driver au lieu d'être insérée dans le texte : une apostrophe ou un point-virgule y sont des données et jamais de la syntaxe — et ils restent hors du journal d'audit.Chaque instruction est enregistrée : qui l'a lancée, sur quel service, combien
de temps elle a pris et si elle a abouti. Les échecs aussi, car une instruction
qui a échoué a quand même eu lieu. Ce qui n'est jamais enregistré, ce sont vos
valeurs --param, celles qui ont le plus de chances d'être des données
personnelles.
Les lectures s'arrêtent à 100 lignes par défaut, et la limite s'applique avant
que les lignes n'atteignent l'api — un curseur sur PostgreSQL, un résultat en
flux sur MySQL — de sorte qu'un select * large n'est jamais chargé en entier
pour être ensuite coupé. Relevez-la avec --limit, jusqu'à 10000, et
--timeout jusqu'à 120000 ms. Quand un résultat a été coupé, la sortie le dit,
au lieu de laisser croire qu'il n'y avait que cela.