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.
Lectura. Quien garantiza que solo lee es el motor, no una lectura nuestra de tu sentencia.
eqs db query pg-main "select id, email from users order by id desc"Modifica filas: insert, update, delete.
eqs db exec pg-main "delete from sessions where expires_at < now()"Modifica la estructura: create, alter, drop. Tiene permiso propio.
eqs db ddl pg-main "alter table users add column nickname text"Lo que guarda el servicio: tablas, colecciones, o etiquetas y tipos de relación.
eqs db tables pg-mainLas columnas de una tabla, los índices de una colección o las propiedades observadas en una etiqueta.
eqs db describe pg-main usersLa 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.
| Motor | Sentencia | Parámetros |
|---|---|---|
| PostgreSQL | SQL | $1, $2 … |
| MySQL / MariaDB | SQL | ? |
| ClickHouse | SQL | {p1:String} … |
| Redis | una línea de comando | añadidos como argumentos |
| MongoDB | un documento de comando JSON | ninguno — los valores van en el documento |
| 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"
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ó.
| Motores | Qué significa | |
|---|---|---|
enforced | PostgreSQL, MySQL, ClickHouse, Neo4j | El motor rechaza la escritura por sí mismo, dentro de una transacción de solo lectura. No hubo que detectar nada |
checked | Redis, MongoDB | El 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 |
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í.
| Verbo | Exige | Quién lo tiene |
|---|---|---|
query, tables, describe | data.read | Reader, Contributor, Owner |
exec | data.write | Contributor, Owner |
ddl | data.ddl | Owner |
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
--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.