From 87d1145c0d6ee4f5a8ecf6d5c62d2479b9cf27ea Mon Sep 17 00:00:00 2001 From: Guillaume Bandet Date: Mon, 4 Nov 2013 16:17:57 +0100 Subject: [PATCH] Fix the conversion of list or tuple args to a SQL. When there is one element on the list, the generated SQL was (1,) (python notation of a single element tuple, which is not valid in SQL. --- MySQLdb/converters.py | 7 +++++-- MySQLdb/cursors.py | 5 ++++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/MySQLdb/converters.py b/MySQLdb/converters.py index 491d49bd..26c1f901 100644 --- a/MySQLdb/converters.py +++ b/MySQLdb/converters.py @@ -129,13 +129,16 @@ def char_array(s): def array2Str(o, d): return Thing2Literal(o.tostring(), d) +def quote_tuple(t, d): + return "(%s)" % (','.join(escape_sequence(t, d))) + conversions = { IntType: Thing2Str, LongType: Long2Int, FloatType: Float2Str, NoneType: None2NULL, - TupleType: escape_sequence, - ListType: escape_sequence, + TupleType: quote_tuple, + ListType: quote_tuple, DictType: escape_dict, InstanceType: Instance2Str, ArrayType: array2Str, diff --git a/MySQLdb/cursors.py b/MySQLdb/cursors.py index 7e5a8874..8815b80a 100644 --- a/MySQLdb/cursors.py +++ b/MySQLdb/cursors.py @@ -180,7 +180,10 @@ def execute(self, query, args=None): if isinstance(query, unicode): query = query.encode(db.unicode_literal.charset) if args is not None: - query = query % db.literal(args) + if isinstance(args, dict): + query = query % {key: db.literal(item) for key, item in args.iteritems()} + else: + query = query % tuple([db.literal(item) for item in args]) try: r = None r = self._query(query)