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.
Leitura. Quem garante que é só leitura é o próprio banco, não uma leitura nossa do seu comando.
eqs db query pg-main "select id, email from users order by id desc"Altera linhas: insert, update, delete.
eqs db exec pg-main "delete from sessions where expires_at < now()"Altera estrutura: create, alter, drop. Tem permissão própria.
eqs db ddl pg-main "alter table users add column nickname text"O que o serviço guarda: tabelas, coleções, ou labels e tipos de relação.
eqs db tables pg-mainAs colunas de uma tabela, os índices de uma coleção ou as propriedades observadas num label.
eqs db describe pg-main usersO 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.
| Engine | Comando | Parâmetros |
|---|---|---|
| PostgreSQL | SQL | $1, $2 … |
| MySQL / MariaDB | SQL | ? |
| ClickHouse | SQL | {p1:String} … |
| Redis | uma linha de comando | anexados como argumentos |
| MongoDB | um documento de comando JSON | nenhum — os valores ficam no 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"
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.
| Engines | O que significa | |
|---|---|---|
enforced | PostgreSQL, MySQL, ClickHouse, Neo4j | A própria engine recusa a escrita, dentro de uma transação somente leitura. Nada precisou ser detectado |
checked | Redis, MongoDB | A 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 |
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.
| Verbo | Exige | Quem tem |
|---|---|---|
query, tables, describe | data.read | Reader, Contributor, Owner |
exec | data.write | Contributor, Owner |
ddl | data.ddl | Owner |
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
--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.