はじめに
OracleとPostgresで同じ挙動をするコードを書いていたのですが、返り値の違いに戸惑ったので、記録用に残しておきます。
この記事の要約
ansibleのpostgresql_scriptモジュールにおいて、query_resultは、複数のSQL文を実行した場合、最後の文の実行結果だけ出力されます。
query_resultを利用した処理を書きたい場合は、注意が必要です!
コード概要
Oracleコード
# DBの状態を確認
- name: Check result of check-db.sql
command: sqlplus -S USER/PASS@SAMPLEDB @{{ TEMP_SQL_FOLDER }}/{{ CHECK_SQL_FILENAME }}
register: check_result
# 特定の条件に合ったときだけDBを更新
- name: UPDATE DB
command: "sqlplus {{ USER }}/{{ PASS }}@SAMPLEDB @{{ TEMP_SQL_FOLDER }}/{{ UPDATE_SQL_FILENAME }}
when: "check_result.stdout is search('NEED TO CHANGE') and check_result.stdout is search('NEED TO FIX')"
# DBの状態を確認
- name: Check result of check-db.sql
community.postgresql.postgresql_script:
db: SAMPLEDB
login_host: "{{ hostvars[groups['AuroraCluster'][0]].endpoint }}"
login_user: "{{ USER }}"
login_password: "{{ PASS }}"
path: "{{ TEMP_SMTP_SQL_FOLDER }}/{{ CHECK_SQL_FILENAME }}"
encoding: UTF-8
register: check_result
# 特定の条件に合ったときだけDBを更新
- name: UPDATE DB
community.postgresql.postgresql_script:
db: SAMPLEDB
login_host: "{{ hostvars[groups['AuroraCluster'][0]].endpoint }}"
login_user: "{{ USER }}"
login_password: "{{ PASS }}"
path: "{{ TEMP_SMTP_SQL_FOLDER }}/{{ UPDATE_SQL_FILENAME }}"
encoding: UTF-8
when: "check_result.query_result is search('NEED TO CHANGE') and check_result.query_result is search('NEED TO FIX')"
SQLが複数行の場合、postgresの方のコードでは、query_resultに1つのSQL文の実行結果しか格納されていなくて悩みました。
原因
原因は、ansibleのpostgresql_scriptモジュールにおいて、query_resultは、複数のSQL文を実行した場合、最後の文の実行結果しか出力されないことでした。
sqlplusのstdoutは複数のSQL文の実行結果もすべて出力されるので、その違いに悩みましたが、無事解決できてよかったです。
query_result
list / elements=dictionaryList of dictionaries in the column:value form representing returned rows.
When there are several statements in the script, returns result of the last statement.
対処として、1つのSQLファイルに1つのSQL文を入れるようにしました!
終わりに
同じようなことに悩んでいる方の解決に役立ったら幸いです