CLI · ComandosDados do serviço

Dados do serviço

Consultar e alterar dados de uma base de dados implantada, a partir do terminal.

eqs db executa uma instrução numa base de dados que instalou pelo marketplace. É a api que guarda as credenciais, verifica a permissão e regista o que correu, portanto nada precisa de ser copiado para a sua máquina primeiro.

eqs db query <svc> "<instrução>"

Leitura. Quem garante que é só leitura é o motor, não uma leitura nossa da sua instrução.

--param <v>Um valor ligado. Pode repetir
--limit <n>Linhas antes de truncar (por omissã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> "<instrução>"

Altera linhas: insert, update, delete.

--param <v>Um valor ligado. Pode repetir
shell
eqs db exec pg-main "delete from sessions where expires_at < now()"
eqs db ddl <svc> "<instrução>"

Altera a 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 etiquetas e tipos de relação.

--jsonJSON simples
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 numa etiqueta.

shell
eqs db describe pg-main users

A instrução é a do próprio motor

Não há um dialecto comum para aprender, e é 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 deles. Uniforme é tudo o que está à volta da instrução: como endereça o serviço, que permissão precisa, como o resultado volta e o que fica registado.

MotorInstruçãoParâmetros
PostgreSQLSQL$1, $2 …
MySQL / MariaDBSQL?
ClickHouseSQL{p1:String} …
Redisuma linha de comandoacrescentados como argumentos
MongoDBum documento de comando JSONnenhum — os valores estão 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"

Quanto é que o "apenas leitura" segura

O eqs db query nunca adivinha se a sua instrução escreve. Ler SQL para decidir isso é frágil e falha aberto, por isso quem decide é o motor — e a saída diz-lhe qual das três respostas obteve.

MotoresO que significa
enforcedPostgreSQL, MySQL, ClickHouse, Neo4jO próprio motor recusa a escrita, dentro de uma transacção apenas de leitura. Nada teve de ser detectado
checkedRedis, MongoDBO motor classificou o comando e nós recusámos com base na resposta dele. Continua a não ser um palpite sobre a sua instrução, mas pode deixar passar o que uma transacção não deixaria
declared—O verbo foi uma declaração e o registo de auditoria é o que responde por ela
Há um caso que escapa ao checked: um aggregate do MongoDB terminado em $out ou $merge escreve, e o MongoDB classifica aggregate como leitura. Apanhá-lo obrigaria a interpretar o pipeline, que é precisamente o palpite que este desenho evita — por isso fica aqui escrito em vez de ser dado como resolvido.

Permissões

Cada verbo exige a sua acção, e não se substituem umas às outras.

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

data.ddl está separado de data.write de propósito: editar uma linha e eliminar uma tabela não são o mesmo risco, e quem pode fazer a primeira não deveria fazer a segunda sem dar por isso.

Valores, limites e o registo

Prefira --param a colar o valor dentro da instrução. É ligado pelo driver em vez de ser inserido no texto, portanto uma aspa ou um ponto e vírgula lá dentro são dados e nunca sintaxe — e ficam fora do registo de auditoria.

Todas as instruções são registadas: quem correu, contra que serviço, quanto tempo demorou e se resultou. As falhas também, porque uma instrução que deu erro aconteceu na mesma. O que nunca é registado são os seus valores de --param, que são os que mais provavelmente contêm dados pessoais.

As leituras param nas 100 linhas por omissão, e o limite é aplicado antes de as linhas chegarem à api — um cursor no PostgreSQL, um resultado transmitido no MySQL — por isso 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 di-lo, em vez de deixar parecer que era tudo.