CLI · CommandesDonnées du service

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.

eqs db query <svc> "<instruction>"

Lecture. C'est le moteur qui garantit qu'il s'agit bien d'une lecture, pas une relecture de votre instruction par nos soins.

--param <v>Une valeur liée. Répétable
--limit <n>Lignes avant troncature (100 par défaut)
--json / --csvSortie exploitable par une machine
shell
eqs db query pg-main "select id, email from users order by id desc"
eqs db exec <svc> "<instruction>"

Modifie des lignes : insert, update, delete.

--param <v>Une valeur liée. Répétable
shell
eqs db exec pg-main "delete from sessions where expires_at < now()"
eqs db ddl <svc> "<instruction>"

Modifie la structure : create, alter, drop. Permission dédiée.

shell
eqs db ddl pg-main "alter table users add column nickname text"
eqs db tables <svc>

Ce que contient le service : tables, collections, ou labels et types de relation.

--jsonJSON brut
shell
eqs db tables pg-main
eqs db describe <svc> <nom>

Les colonnes d'une table, les index d'une collection ou les propriétés observées sur un label.

shell
eqs db describe pg-main users

L'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é.

MoteurInstructionParamètres
PostgreSQLSQL$1, $2 …
MySQL / MariaDBSQL?
ClickHouseSQL{p1:String} …
Redisune ligne de commandeajoutés comme arguments
MongoDBun document de commande JSONaucun — les valeurs sont dans le document
Neo4jCypher$p1, $p2 …
bash
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.

MoteursCe que cela veut dire
enforcedPostgreSQL, MySQL, ClickHouse, Neo4jLe moteur refuse lui-même l'écriture, dans une transaction en lecture seule. Rien n'a eu à être détecté
checkedRedis, MongoDBLe 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
Un cas échappe à 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.

VerbeExigeQui l'a
query, tables, describedata.readReader, Contributor, Owner
execdata.writeContributor, Owner
ddldata.ddlOwner

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

Préférez --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.