mirror of
https://github.com/ansible-collections/community.mysql.git
synced 2025-04-24 03:11:25 -07:00
mysql_query: fix failing when single-row query contains commas (#53)
* mysql_query: fix failing when single-row query contains commas * add changelog fragment * Improve documentation and tests * Fix typo * Improve test coverage * Fix * Remove the irrelevant note * change suggested
This commit is contained in:
parent
0dfd63a4cb
commit
ae9c0a1751
4 changed files with 69 additions and 5 deletions
|
@ -0,0 +1,2 @@
|
||||||
|
bugfixes:
|
||||||
|
- mysql_query - fix failing when single-row query contains commas (https://github.com/ansible-collections/community.mysql/issues/51).
|
|
@ -20,8 +20,8 @@ options:
|
||||||
query:
|
query:
|
||||||
description:
|
description:
|
||||||
- SQL query to run. Multiple queries can be passed using YAML list syntax.
|
- SQL query to run. Multiple queries can be passed using YAML list syntax.
|
||||||
type: list
|
- Must be a string or YAML list containing strings.
|
||||||
elements: str
|
type: raw
|
||||||
required: yes
|
required: yes
|
||||||
positional_args:
|
positional_args:
|
||||||
description:
|
description:
|
||||||
|
@ -42,8 +42,6 @@ options:
|
||||||
- Where passed queries run in a single transaction (C(yes)) or commit them one-by-one (C(no)).
|
- Where passed queries run in a single transaction (C(yes)) or commit them one-by-one (C(no)).
|
||||||
type: bool
|
type: bool
|
||||||
default: no
|
default: no
|
||||||
notes:
|
|
||||||
- To pass a query containing commas, use YAML list notation with hyphen (see EXAMPLES block).
|
|
||||||
author:
|
author:
|
||||||
- Andrew Klychkov (@Andersson007)
|
- Andrew Klychkov (@Andersson007)
|
||||||
extends_documentation_fragment:
|
extends_documentation_fragment:
|
||||||
|
@ -123,7 +121,7 @@ DDL_QUERY_KEYWORDS = ('CREATE', 'DROP', 'ALTER', 'RENAME', 'TRUNCATE')
|
||||||
def main():
|
def main():
|
||||||
argument_spec = mysql_common_argument_spec()
|
argument_spec = mysql_common_argument_spec()
|
||||||
argument_spec.update(
|
argument_spec.update(
|
||||||
query=dict(type='list', elements='str', required=True),
|
query=dict(type='raw', required=True),
|
||||||
login_db=dict(type='str'),
|
login_db=dict(type='str'),
|
||||||
positional_args=dict(type='list'),
|
positional_args=dict(type='list'),
|
||||||
named_args=dict(type='dict'),
|
named_args=dict(type='dict'),
|
||||||
|
@ -147,6 +145,17 @@ def main():
|
||||||
check_hostname = module.params['check_hostname']
|
check_hostname = module.params['check_hostname']
|
||||||
config_file = module.params['config_file']
|
config_file = module.params['config_file']
|
||||||
query = module.params["query"]
|
query = module.params["query"]
|
||||||
|
|
||||||
|
if not isinstance(query, str) and not isinstance(query, list):
|
||||||
|
module.fail_json(msg="the query option value must be a string or list, passed %s" % type(query))
|
||||||
|
|
||||||
|
if isinstance(query, str):
|
||||||
|
query = [query]
|
||||||
|
|
||||||
|
for elem in query:
|
||||||
|
if not isinstance(elem, str):
|
||||||
|
module.fail_json(msg="the elements in query list must be strings, passed '%s' %s" % (elem, type(elem)))
|
||||||
|
|
||||||
if module.params["single_transaction"]:
|
if module.params["single_transaction"]:
|
||||||
autocommit = False
|
autocommit = False
|
||||||
else:
|
else:
|
||||||
|
@ -183,6 +192,7 @@ def main():
|
||||||
query_result = []
|
query_result = []
|
||||||
executed_queries = []
|
executed_queries = []
|
||||||
rowcount = []
|
rowcount = []
|
||||||
|
|
||||||
for q in query:
|
for q in query:
|
||||||
try:
|
try:
|
||||||
cursor.execute(q, arguments)
|
cursor.execute(q, arguments)
|
||||||
|
|
|
@ -6,6 +6,7 @@ db_name: data
|
||||||
test_db: testdb
|
test_db: testdb
|
||||||
test_table1: test1
|
test_table1: test1
|
||||||
test_table2: test2
|
test_table2: test2
|
||||||
|
test_table3: test3
|
||||||
test_script_path: /tmp/test.sql
|
test_script_path: /tmp/test.sql
|
||||||
|
|
||||||
user_name_1: 'db_user1'
|
user_name_1: 'db_user1'
|
||||||
|
|
|
@ -238,6 +238,57 @@
|
||||||
that:
|
that:
|
||||||
- result.rowcount == [0]
|
- result.rowcount == [0]
|
||||||
|
|
||||||
|
- name: Create {{ test_table3 }}
|
||||||
|
mysql_query:
|
||||||
|
<<: *mysql_params
|
||||||
|
login_db: '{{ test_db }}'
|
||||||
|
query: 'CREATE TABLE {{ test_table3 }} (id int, story text)'
|
||||||
|
|
||||||
|
- name: Add data to {{ test_table3 }}
|
||||||
|
mysql_query:
|
||||||
|
<<: *mysql_params
|
||||||
|
login_db: '{{ test_db }}'
|
||||||
|
query: "INSERT INTO {{ test_table3 }} (id, story) VALUES (1, 'first'), (2, 'second')"
|
||||||
|
|
||||||
|
- name: Select from {{ test_table3 }}
|
||||||
|
mysql_query:
|
||||||
|
<<: *mysql_params
|
||||||
|
login_db: '{{ test_db }}'
|
||||||
|
query: 'SELECT id, story FROM {{ test_table3 }}'
|
||||||
|
register: result
|
||||||
|
|
||||||
|
- assert:
|
||||||
|
that:
|
||||||
|
- result.rowcount == [2]
|
||||||
|
|
||||||
|
- name: Pass wrong query type
|
||||||
|
mysql_query:
|
||||||
|
<<: *mysql_params
|
||||||
|
login_db: '{{ test_db }}'
|
||||||
|
query: {'this type is': 'wrong'}
|
||||||
|
register: result
|
||||||
|
ignore_errors: yes
|
||||||
|
|
||||||
|
- assert:
|
||||||
|
that:
|
||||||
|
- result is failed
|
||||||
|
- result.msg is search('the query option value must be a string or list')
|
||||||
|
|
||||||
|
- name: Pass wrong query element
|
||||||
|
mysql_query:
|
||||||
|
<<: *mysql_params
|
||||||
|
login_db: '{{ test_db }}'
|
||||||
|
query:
|
||||||
|
- 'SELECT now()'
|
||||||
|
- {'this type is': 'wrong'}
|
||||||
|
register: result
|
||||||
|
ignore_errors: yes
|
||||||
|
|
||||||
|
- assert:
|
||||||
|
that:
|
||||||
|
- result is failed
|
||||||
|
- result.msg is search('the elements in query list must be strings')
|
||||||
|
|
||||||
- name: Drop db {{ test_db }}
|
- name: Drop db {{ test_db }}
|
||||||
mysql_query:
|
mysql_query:
|
||||||
<<: *mysql_params
|
<<: *mysql_params
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue