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:
parent
3f65dab6b2
commit
39d30ffeaa
1 changed files with 14 additions and 12 deletions
|
|
@ -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):
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue