Servicedaten
Daten einer bereitgestellten Datenbank vom Terminal aus abfragen und ändern.
eqs db führt eine Anweisung gegen eine Datenbank aus, die Sie über den Marketplace bereitgestellt haben. Die api hält die Zugangsdaten, prüft die Berechtigung und protokolliert, was gelaufen ist — es muss also nichts vorher auf Ihren Rechner kopiert werden.
Lesen. Dass wirklich nur gelesen wird, stellt die Engine sicher — nicht wir, indem wir Ihre Anweisung lesen.
eqs db query pg-main "select id, email from users order by id desc"Ändert Zeilen: insert, update, delete.
eqs db exec pg-main "delete from sessions where expires_at < now()"Ändert die Struktur: create, alter, drop. Mit eigener Berechtigung.
eqs db ddl pg-main "alter table users add column nickname text"Was der Service enthält: Tabellen, Collections oder Labels und Beziehungstypen.
eqs db tables pg-mainDie Spalten einer Tabelle, die Indizes einer Collection oder die beobachteten Eigenschaften eines Labels.
eqs db describe pg-main usersDie Anweisung ist die der Engine selbst
Es gibt bewusst keinen gemeinsamen Dialekt zu lernen. Eine Sprache, die SQL, Redis-Kommandos, Mongo-Dokumente und Cypher zugleich abdeckt, wäre von jedem davon die schlechtere Fassung. Einheitlich ist alles rundherum: wie Sie den Service adressieren, welche Berechtigung Sie brauchen, wie das Ergebnis zurückkommt und was protokolliert wird.
| Engine | Anweisung | Parameter |
|---|---|---|
| PostgreSQL | SQL | $1, $2 … |
| MySQL / MariaDB | SQL | ? |
| ClickHouse | SQL | {p1:String} … |
| Redis | eine Kommandozeile | werden als Argumente angehängt |
| MongoDB | ein JSON-Kommandodokument | keine — die Werte stehen im Dokument |
| 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"
Wie fest „nur lesen" hält
eqs db query rät nie, ob Ihre Anweisung schreibt. SQL zu lesen, um das zu
entscheiden, ist brüchig und lässt im Zweifel durch — also entscheidet die
Engine, und die Ausgabe sagt Ihnen, welche der drei Antworten Sie bekommen
haben.
| Engines | Was es bedeutet | |
|---|---|---|
enforced | PostgreSQL, MySQL, ClickHouse, Neo4j | Die Engine lehnt den Schreibvorgang selbst ab, in einer Nur-Lese-Transaktion. Es musste nichts erkannt werden |
checked | Redis, MongoDB | Die Engine hat das Kommando eingestuft, und wir lehnen anhand ihrer Antwort ab. Immer noch keine Vermutung über Ihre Anweisung, aber es kann durchlassen, was eine Transaktion aufgehalten hätte |
declared | — | Das Verb war eine Erklärung, und der Auditeintrag ist das, was dafür geradesteht |
checked: ein MongoDB-aggregate, das auf $out oder $merge endet, schreibt — und MongoDB stuft aggregate als Lesevorgang ein. Das abzufangen hieße, die Pipeline zu interpretieren, also genau jene Vermutung, die dieser Entwurf vermeidet. Deshalb steht es hier, statt stillschweigend als gelöst zu gelten.Berechtigungen
Jedes Verb verlangt seine eigene Aktion, und sie vertreten einander nicht.
| Verb | Verlangt | Wer sie hat |
|---|---|---|
query, tables, describe | data.read | Reader, Contributor, Owner |
exec | data.write | Contributor, Owner |
ddl | data.ddl | Owner |
data.ddl ist bewusst von data.write getrennt: eine Zeile zu ändern und eine
Tabelle zu löschen sind nicht dasselbe Risiko, und wer das eine darf, sollte das
andere nicht nebenbei tun.
Werte, Grenzen und das Protokoll
--param, statt den Wert in die Anweisung zu kleben. Er wird vom Treiber gebunden statt in den Text eingesetzt, also sind ein Anführungszeichen oder ein Semikolon darin Daten und niemals Syntax — und sie bleiben aus dem Auditlog heraus.Jede Anweisung wird protokolliert: wer sie ausgeführt hat, gegen welchen
Service, wie lange sie gedauert hat und ob sie funktioniert hat. Fehlschläge
ebenso, denn eine Anweisung, die einen Fehler geworfen hat, ist trotzdem
passiert. Nie protokolliert werden Ihre --param-Werte, also genau die, die am
ehesten personenbezogene Daten enthalten.
Lesevorgänge stoppen standardmäßig bei 100 Zeilen, und das Limit greift, bevor
die Zeilen die api erreichen — ein Cursor bei PostgreSQL, ein gestreamtes
Ergebnis bei MySQL — sodass ein breites select * nie vollständig gepuffert
wird, nur um dann gekürzt zu werden. Erhöhen Sie es mit --limit, bis 10000,
und --timeout bis 120000 ms. Wurde ein Ergebnis gekürzt, sagt die Ausgabe das,
statt es so aussehen zu lassen, als wäre das alles gewesen.