解析 YAML 以在 shell 中建立動態查詢

解析 YAML 以在 shell 中建立動態查詢

我對腳本編寫非常陌生,我的任務是找出編寫 shell 腳本的方法,該腳本將根據提供的 YAML 文件建立 SQL 查詢。我可以追蹤到yq要使用的解析器;但是,我一直不知道如何使用 YAML 子節點中的各個值。我需要解析的範例 YAML 是:

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'

我目前嘗試編寫的腳本只不過是SELECT語句,但稍後會演變:

# 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

如果可能的話,在聽起來不那麼需要的情況下,我希望看到有關如何使用yq庫的建議,因為它支援在 SQL 部分完成後我需要對此腳本執行的一系列操作。

如果問題太愚蠢,我深表歉意,這將是我第一次接觸 shell 腳本。

如果相關的話,我正在使用 Ubuntu 18.4 發行版。

答案1

使用安德烈·基斯柳克yq(圍繞 JSON 處理器的 YAML 感知包裝器jq)而不是 Mike Farah 的yq,您可以建立執行查詢所需的 shell 語句,如下所示:

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

或者,如果您不喜歡使用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

這會迭代數組configpsql為每個元素建立一個命令。此psql指令從條目的和值(使用輸出運算子為 shell 引用)取得其-p和選項參數。-dportdatabase_name@sh

實際的 SQL 語句透過此處文件重定向提供給命令,並由任意選擇的字串分隔END_SQL。這些語句values會原樣使用需要提取的欄位的值,並將該name值用作從中提取欄位的表的名稱。不對這些值執行特殊引用。

根據問題中的數據,上述命令產生以下 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

然後,您可以透過管道將其傳遞到sh -s或使用 求值來執行此程式碼eval

相關內容