Analisando YAML para criar consultas dinâmicas no shell

Analisando YAML para criar consultas dinâmicas no shell

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 oyqanalisador 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 SELECTdeclaraçõ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 yqa 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 configarray, criando um psqlcomando para cada elemento. O psqlcomando obtém seus argumentos de opção -pe dos valores e -dda entrada (citados para o shell usando o operador de saída).portdatabase_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 valuesvalor como está para os campos que precisam ser extraídos e o namevalor 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.

informação relacionada