6
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

postgresql_scriptの返り値の注意点

Posted at

はじめに

OracleとPostgresで同じ挙動をするコードを書いていたのですが、返り値の違いに戸惑ったので、記録用に残しておきます。

この記事の要約

ansibleのpostgresql_scriptモジュールにおいて、query_resultは、複数のSQL文を実行した場合、最後の文の実行結果だけ出力されます。

query_resultを利用した処理を書きたい場合は、注意が必要です!

コード概要

Oracleコード

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')"
postgres
 # 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=dictionary

List 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文を入れるようにしました!

終わりに

同じようなことに悩んでいる方の解決に役立ったら幸いです:blush:

6
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?