CLI · ComandosDados do serviço

Dados do serviço

Consultar e alterar dados de um banco implantado, direto do terminal.

eqs db executa um comando num banco que você subiu pelo marketplace. A api é quem guarda as credenciais, confere a permissão e registra o que rodou, então nada precisa ser copiado para a sua máquina antes.

eqs db query <svc> "<comando>"

Leitura. Quem garante que é só leitura é o próprio banco, não uma leitura nossa do seu comando.

--param <v>Um valor vinculado. Pode repetir
--limit <n>Linhas antes de truncar (padrão 100)
--json / --csvSaída legível por máquina
shell
eqs db query pg-main "select id, email from users order by id desc"
eqs db exec <svc> "<comando>"

Altera linhas: insert, update, delete.

--param <v>Um valor vinculado. Pode repetir
shell
eqs db exec pg-main "delete from sessions where expires_at < now()"
eqs db ddl <svc> "<comando>"

Altera estrutura: create, alter, drop. Tem permissão própria.

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

O que o serviço guarda: tabelas, coleções, ou labels e tipos de relação.

--jsonJSON puro
shell
eqs db tables pg-main
eqs db describe <svc> <nome>

As colunas de uma tabela, os índices de uma coleção ou as propriedades observadas num label.

shell
eqs db describe pg-main users

O comando é o da própria engine

Não há um dialeto comum para aprender, e isso é de propósito. Uma linguagem que cobrisse SQL, comandos Redis, documentos Mongo e Cypher ao mesmo tempo seria uma versão pior de cada um. Uniforme é tudo o que está em volta: como você endereça o serviço, qual permissão precisa, como o resultado volta e o que fica registrado.

EngineComandoParâmetros
PostgreSQLSQL$1, $2 …
MySQL / MariaDBSQL?
ClickHouseSQL{p1:String} …
Redisuma linha de comandoanexados como argumentos
MongoDBum documento de comando JSONnenhum — os valores ficam no 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"

O quanto o "somente leitura" segura

O eqs db query nunca adivinha se o seu comando escreve. Ler SQL para decidir isso é frágil e falha aberto, então quem decide é a engine — e a saída diz qual das três respostas você recebeu.

EnginesO que significa
enforcedPostgreSQL, MySQL, ClickHouse, Neo4jA própria engine recusa a escrita, dentro de uma transação somente leitura. Nada precisou ser detectado
checkedRedis, MongoDBA engine classificou o comando e nós recusamos com base na resposta dela. Ainda não é palpite sobre o seu comando, mas pode deixar passar o que uma transação não deixaria
declared—O verbo foi uma declaração e o registro de auditoria é o que responde por ela
Um caso escapa do checked: um aggregate do MongoDB terminando em $out ou $merge escreve, e o MongoDB classifica aggregate como leitura. Pegar isso exigiria interpretar o pipeline, que é justamente o palpite que este desenho evita — então fica escrito aqui em vez de ser varrido para debaixo do tapete.

Permissões

Cada verbo exige a sua ação, e elas não se substituem.

VerboExigeQuem tem
query, tables, describedata.readReader, Contributor, Owner
execdata.writeContributor, Owner
ddldata.ddlOwner

data.ddl é separado de data.write de propósito: editar uma linha e derrubar uma tabela não são o mesmo risco, e quem pode fazer o primeiro não deveria fazer o segundo sem querer.

Valores, limites e o registro

Prefira --param a colar o valor dentro do comando. Ele é vinculado pelo driver em vez de ser costurado no texto, então uma aspa ou um ponto e vírgula ali dentro são dado e nunca sintaxe — e ficam fora do log de auditoria.

Todo comando é registrado: quem rodou, contra qual serviço, quanto tempo levou e se deu certo. Falhas também entram, porque um comando que deu erro aconteceu do mesmo jeito. O que nunca é registrado são os seus valores de --param, que são os mais prováveis de conter dado pessoal.

Leituras param em 100 linhas por padrão, e o limite é aplicado antes de as linhas chegarem à api — um cursor no PostgreSQL, um resultado transmitido no MySQL — então um select * largo nunca é carregado inteiro só para ser cortado. Aumente com --limit, até 10000, e --timeout até 120000 ms. Quando o resultado foi cortado, a saída avisa, em vez de deixar parecer que aquilo era tudo.