CLI · BefehleServicedaten

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.

eqs db query <svc> "<Anweisung>"

Lesen. Dass wirklich nur gelesen wird, stellt die Engine sicher — nicht wir, indem wir Ihre Anweisung lesen.

--param <v>Ein gebundener Wert. Wiederholbar
--limit <n>Zeilen vor dem Abschneiden (Standard 100)
--json / --csvMaschinenlesbare Ausgabe
shell
eqs db query pg-main "select id, email from users order by id desc"
eqs db exec <svc> "<Anweisung>"

Ändert Zeilen: insert, update, delete.

--param <v>Ein gebundener Wert. Wiederholbar
shell
eqs db exec pg-main "delete from sessions where expires_at < now()"
eqs db ddl <svc> "<Anweisung>"

Ändert die Struktur: create, alter, drop. Mit eigener Berechtigung.

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

Was der Service enthält: Tabellen, Collections oder Labels und Beziehungstypen.

--jsonReines JSON
shell
eqs db tables pg-main
eqs db describe <svc> <Name>

Die Spalten einer Tabelle, die Indizes einer Collection oder die beobachteten Eigenschaften eines Labels.

shell
eqs db describe pg-main users

Die 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.

EngineAnweisungParameter
PostgreSQLSQL$1, $2 …
MySQL / MariaDBSQL?
ClickHouseSQL{p1:String} …
Rediseine Kommandozeilewerden als Argumente angehängt
MongoDBein JSON-Kommandodokumentkeine — die Werte stehen im Dokument
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"

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.

EnginesWas es bedeutet
enforcedPostgreSQL, MySQL, ClickHouse, Neo4jDie Engine lehnt den Schreibvorgang selbst ab, in einer Nur-Lese-Transaktion. Es musste nichts erkannt werden
checkedRedis, MongoDBDie 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
Ein Fall entwischt 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.

VerbVerlangtWer sie hat
query, tables, describedata.readReader, Contributor, Owner
execdata.writeContributor, Owner
ddldata.ddlOwner

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

Nehmen Sie --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.