1
0
Fork 0
mirror of https://github.com/ansible-collections/community.general.git synced 2024-09-14 20:13:21 +02:00

postgresql_query: add search_path parameter (#653)

* postgresql_query: add search_path parameter

* add CI tests

* add ref to seealso

* add changelog fragment

* fix test syntax

* fix test syntax

* fix

* fix

* fix CI syntax

* cosmetic change

* improve CI test

* move CI tests to the right place

* improve CI
This commit is contained in:
Andrew Klychkov 2020-07-20 10:08:02 +03:00 committed by GitHub
parent ee6baa30cf
commit 09d68678ee
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 107 additions and 0 deletions

View file

@ -0,0 +1,2 @@
minor_changes:
- postgresql_query - add search_path parameter (https://github.com/ansible-collections/community.general/issues/625).

View file

@ -75,8 +75,17 @@ options:
type: bool
default: yes
version_added: '0.2.0'
search_path:
description:
- List of schema names to look in.
type: list
elements: str
version_added: '1.0.0'
seealso:
- module: community.general.postgresql_db
- name: PostgreSQL Schema reference
description: Complete reference of the PostgreSQL schema documentation.
link: https://www.postgresql.org/docs/current/ddl-schemas.html
author:
- Felix Archambault (@archf)
- Andrew Klychkov (@Andersson007)
@ -152,6 +161,16 @@ EXAMPLES = r'''
positional_args:
- '{{ my_list }}'
- '{{ my_arr|string }}'
# Select from test table looking into app1 schema first, then,
# if the schema doesn't exist or the table hasn't been found there,
# try to find it in the schema public
- name: Select from test using search_path
community.general.postgresql_query:
query: SELECT * FROM test_array_table
search_path:
- app1
- public
'''
RETURN = r'''
@ -242,6 +261,16 @@ def convert_elements_to_pg_arrays(obj):
return obj
def set_search_path(cursor, search_path):
"""Set session's search_path.
Args:
cursor (Psycopg2 cursor): Database cursor object.
search_path (str): String containing comma-separated schema names.
"""
cursor.execute('SET search_path TO %s' % search_path)
def main():
argument_spec = postgres_common_argument_spec()
argument_spec.update(
@ -254,6 +283,7 @@ def main():
autocommit=dict(type='bool', default=False),
encoding=dict(type='str'),
trust_input=dict(type='bool', default=True),
search_path=dict(type='list', elements='str'),
)
module = AnsibleModule(
@ -270,6 +300,7 @@ def main():
encoding = module.params["encoding"]
session_role = module.params["session_role"]
trust_input = module.params["trust_input"]
search_path = module.params["search_path"]
if not trust_input:
# Check input for potentially dangerous elements:
@ -300,6 +331,9 @@ def main():
db_connection.set_client_encoding(encoding)
cursor = db_connection.cursor(cursor_factory=DictCursor)
if search_path:
set_search_path(cursor, '%s' % ','.join([x.strip(' ') for x in search_path]))
# Prepare args:
if module.params.get("positional_args"):
arguments = module.params["positional_args"]

View file

@ -457,3 +457,74 @@
name: test_array_table
state: absent
when: postgres_version_resp.stdout is version('9.4', '>=')
#############################
# Check search_path parameter
- name: postgresql_set - create test schemas
become_user: '{{ pg_user }}'
become: true
postgresql_schema:
login_user: '{{ pg_user }}'
login_db: postgres
name: '{{ item }}'
loop:
- query_test1
- query_test2
- name: postgresql_set - create test tables
become_user: '{{ pg_user }}'
become: true
postgresql_table:
login_user: '{{ pg_user }}'
login_db: postgres
name: '{{ item }}'
columns:
- id int
loop:
- 'query_test1.test1'
- 'query_test2.test2'
- name: postgresql_query - insert data
become_user: '{{ pg_user }}'
become: true
postgresql_query:
login_user: '{{ pg_user }}'
login_db: postgres
query: 'INSERT INTO {{ item }} (id) VALUES (1)'
search_path:
- query_test1
- query_test2
loop:
- test1
- test2
- name: postgresql_query - get data
become_user: '{{ pg_user }}'
become: true
postgresql_query:
login_user: '{{ pg_user }}'
login_db: postgres
query: 'SELECT id FROM test1'
search_path:
- query_test1
- query_test2
register: result
- assert:
that:
- result.rowcount == 1
- name: postgresql_query - get data, must fail
become_user: '{{ pg_user }}'
become: true
postgresql_query:
login_user: '{{ pg_user }}'
login_db: postgres
query: 'SELECT id FROM test1'
register: result
ignore_errors: yes
- assert:
that:
- result is failed