CLI · ComandosDatos del servicio

Datos del servicio

Consultar y modificar datos de una base de datos desplegada, desde la terminal.

eqs db ejecuta una sentencia contra una base de datos que desplegaste desde el marketplace. La api es la que guarda las credenciales, comprueba el permiso y registra lo que se ejecutó, así que no hay que copiar nada a tu máquina primero.

eqs db query <svc> "<sentencia>"

Lectura. Quien garantiza que solo lee es el motor, no una lectura nuestra de tu sentencia.

--param <v>Un valor vinculado. Repetible
--limit <n>Filas antes de truncar (por defecto 100)
--json / --csvSalida legible por máquina
shell
eqs db query pg-main "select id, email from users order by id desc"
eqs db exec <svc> "<sentencia>"

Modifica filas: insert, update, delete.

--param <v>Un valor vinculado. Repetible
shell
eqs db exec pg-main "delete from sessions where expires_at < now()"
eqs db ddl <svc> "<sentencia>"

Modifica la estructura: create, alter, drop. Tiene permiso propio.

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

Lo que guarda el servicio: tablas, colecciones, o etiquetas y tipos de relación.

--jsonJSON en crudo
shell
eqs db tables pg-main
eqs db describe <svc> <nombre>

Las columnas de una tabla, los índices de una colección o las propiedades observadas en una etiqueta.

shell
eqs db describe pg-main users

La sentencia es la del propio motor

No hay un dialecto común que aprender, y es a propósito. Un lenguaje que cubriera SQL, comandos de Redis, documentos de Mongo y Cypher a la vez sería una versión peor de cada uno. Lo uniforme es todo lo que rodea a la sentencia: cómo te diriges al servicio, qué permiso necesitas, cómo vuelve el resultado y qué queda registrado.

MotorSentenciaParámetros
PostgreSQLSQL$1, $2 …
MySQL / MariaDBSQL?
ClickHouseSQL{p1:String} …
Redisuna línea de comandoañadidos como argumentos
MongoDBun documento de comando JSONninguno — los valores van en el documento
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"

Cuánto aguanta el "solo lectura"

eqs db query nunca adivina si tu sentencia escribe. Leer SQL para decidirlo es frágil y falla abriendo, así que quien decide es el motor — y la salida te dice cuál de las tres respuestas te tocó.

MotoresQué significa
enforcedPostgreSQL, MySQL, ClickHouse, Neo4jEl motor rechaza la escritura por sí mismo, dentro de una transacción de solo lectura. No hubo que detectar nada
checkedRedis, MongoDBEl motor clasificó el comando y nosotros rechazamos según su respuesta. Sigue sin ser una suposición sobre tu sentencia, pero puede dejar pasar lo que una transacción no dejaría
declared—El verbo fue una declaración y el registro de auditoría es lo que responde por ella
Un caso se escapa de checked: un aggregate de MongoDB que termina en $out o $merge escribe, y MongoDB clasifica aggregate como lectura. Atraparlo exigiría interpretar el pipeline, que es justo la suposición que este diseño evita — así que queda escrito aquí en lugar de darse por resuelto.

Permisos

Cada verbo exige su propia acción, y no se sustituyen entre sí.

VerboExigeQuién lo tiene
query, tables, describedata.readReader, Contributor, Owner
execdata.writeContributor, Owner
ddldata.ddlOwner

data.ddl está separado de data.write a propósito: editar una fila y borrar una tabla no son el mismo riesgo, y quien puede hacer lo primero no debería hacer lo segundo sin querer.

Valores, límites y el registro

Prefiere --param antes que pegar el valor dentro de la sentencia. Lo vincula el driver en vez de coserlo al texto, así que una comilla o un punto y coma ahí dentro son datos y nunca sintaxis — y se quedan fuera del registro de auditoría.

Toda sentencia queda registrada: quién la ejecutó, contra qué servicio, cuánto tardó y si funcionó. Los fallos también, porque una sentencia que dio error ocurrió igualmente. Lo que nunca se registra son tus valores de --param, que son los que con más probabilidad contienen datos personales.

Las lecturas se detienen en 100 filas por defecto, y el límite se aplica antes de que las filas lleguen a la api — un cursor en PostgreSQL, un resultado en streaming en MySQL — así que un select * ancho nunca se carga entero solo para recortarlo. Súbelo con --limit, hasta 10000, y --timeout hasta 120000 ms. Cuando el resultado se recortó, la salida lo dice, en vez de dejar que parezca que eso era todo.