Sou muito novo em scripts e recebi a tarefa de descobrir uma maneira de criar um script de shell que criará consultas SQL com base em um documento YAML fornecido. Eu poderia rastrear oyq
analisador a ser usado; no entanto, não sei como usar valores individuais dos nós filhos do YAML. O exemplo de YAML que preciso analisar é:
config:
- system1:
database_name: database1
port: '1234'
table:
- name: table1
values: 'table_id, value1, 30, randomValue'
- name: table2
values: 'table_id, value1, randomValue, randomValue, value2'
- name: table2
values: 'table_id, value2, randomValue, randomValue'
- system2:
database_name: database2
port: '12345'
table:
- name: table4
values: 'table_id, value3, 30, randomValue'
- name: table5
values: 'table_id, randomValue, randomValue, value4'
- name: table6
values: 'table_id, value3, value4'
O script que estou tentando escrever atualmente nada mais é do que SELECT
declarações, mas irá evoluir mais tarde:
# This will later be used to create insert/update queries based on the values so
# will be needing a handle for that too.
psql -h localhost -p $PORT -d $DATABASE << EOF
select * from $TABLE LIMIT 10;
EOF
Se possível, sem parecer carente, espero ver sugestões sobre como posso usar yq
a biblioteca, visto que ela suporta várias operações que precisarei fazer neste script assim que a parte SQL for concluída.
Peço desculpas se a pergunta for muito estúpida, seria minha primeira vez em shell script.
Estou usando a distribuição Ubuntu 18.4, se for relevante.
Responder1
UsandoAndrey Kislyukyq
(um wrapper compatível com YAML em torno do processador JSON jq
) em vez do de Mike Farah yq
, você pode criar as instruções de shell necessárias para executar as consultas da seguinte forma:
yq -r '
.config[] |
map(
@sh "psql -h localhost -p \(.port) -d \(.database_name) <<END_SQL",
(.table | map("SELECT \(.values) FROM \(.name) LIMIT 10;"))[],
"END_SQL"
)[]' file
ou, se você não gosta de usar map
:
yq -r '
.config[][] |
@sh "psql -h localhost -p \(.port) -d \(.database_name) <<END_SQL",
(.table[] | "SELECT \(.values) FROM \(.name) LIMIT 10;"),
"END_SQL"' file
Isso itera no config
array, criando um psql
comando para cada elemento. O psql
comando obtém seus argumentos de opção -p
e dos valores e -d
da entrada (citados para o shell usando o operador de saída).port
database_name
@sh
As instruções SQL reais são fornecidas ao comando por meio de um redirecionamento aqui-documento, delimitado pela string arbitrária escolhida END_SQL
. As instruções usam o values
valor como está para os campos que precisam ser extraídos e o name
valor como o nome da tabela de onde extrair os campos. Nenhuma cotação especial é realizada nesses valores.
Dados os dados da pergunta, o comando acima gera o seguinte código shell:
psql -h localhost -p '1234' -d 'database1' <<END_SQL
SELECT table_id, value1, 30, randomValue FROM table1 LIMIT 10;
SELECT table_id, value1, randomValue, randomValue, value2 FROM table2 LIMIT 10;
SELECT table_id, value2, randomValue, randomValue FROM table2 LIMIT 10;
END_SQL
psql -h localhost -p '12345' -d 'database2' <<END_SQL
SELECT table_id, value3, 30, randomValue FROM table4 LIMIT 10;
SELECT table_id, randomValue, randomValue, value4 FROM table5 LIMIT 10;
SELECT table_id, value3, value4 FROM table6 LIMIT 10;
END_SQL
Você pode então executar esse código canalizando-o para sh -s
, ou avaliando-o com eval
.