fix: Database._transform_query

* Handle dict substitutions in transformations too
* Allow list / tuple values
* Check for values inconsistencies before flattening step
This commit is contained in:
Gavin D'souza 2022-06-30 19:12:10 +05:30
parent 3f65dab6b2
commit 39d30ffeaa

View file

@ -236,6 +236,18 @@ class MariaDBConnectionUtil:
ref: https://jira.mariadb.org/projects/CONPY/issues/CONPY-205
"""
pos_values = []
named_tokens = _PARAM_COMP.findall(query)
for token in named_tokens:
key = token[2:-2]
val = values[key]
if isinstance(val, (tuple, list)):
val = escape_sequence(val)
pos_values.append(val)
query = query.replace(token, "%s", 1)
if pos_values:
values = pos_values
# Handle sequences in values - PyMySQL & Psycopg allowed them but MariaDB client doesn't
# This leads to a DataError. MariaDB connector expects a flat tuple. Build queries with
@ -246,7 +258,7 @@ class MariaDBConnectionUtil:
for i, val in enumerate(values):
pos = next(find_iter)
if isinstance(val, list):
if isinstance(val, (list, tuple)):
query = (
query[: pos.start()]
+ escape_sequence(val, charset=self._conn.character_set)
@ -254,17 +266,7 @@ class MariaDBConnectionUtil:
)
del values[i]
named_tokens = _PARAM_COMP.findall(query)
if not named_tokens or len(set(named_tokens)) == len(values):
return query, values
for token in named_tokens:
key = token[2:-2]
pos_values.append(values[key])
query = query.replace(token, "%s", 1)
return query, pos_values
return query, values
class MariaDBDatabase(MariaDBConnectionUtil, MariaDBExceptionUtil, Database):