diff --git a/django/db/backends/oracle/base.py b/django/db/backends/oracle/base.py index 76e5743539..dbb1d032eb 100644 --- a/django/db/backends/oracle/base.py +++ b/django/db/backends/oracle/base.py @@ -438,21 +438,6 @@ class FormatStylePlaceholderCursor(Database.Cursor): """ charset = 'utf-8' - def _rewrite_args(self, query, params=None): - if params is None: - params = [] - else: - params = self._format_params(params) - args = [(':arg%d' % i) for i in range(len(params))] - query = smart_str(query, self.charset) % tuple(args) - # cx_Oracle wants no trailing ';' for SQL statements. For PL/SQL, it - # it does want a trailing ';' but not a trailing '/'. However, these - # characters must be included in the original query in case the query - # is being passed to SQL*Plus. - if query.endswith(';') or query.endswith('/'): - query = query[:-1] - return query, params - def _format_params(self, params): if isinstance(params, dict): result = {} @@ -464,12 +449,35 @@ class FormatStylePlaceholderCursor(Database.Cursor): return tuple([smart_str(p, self.charset, True) for p in params]) def execute(self, query, params=None): - query, params = self._rewrite_args(query, params) + if params is None: + params = [] + else: + params = self._format_params(params) + args = [(':arg%d' % i) for i in range(len(params))] + # cx_Oracle wants no trailing ';' for SQL statements. For PL/SQL, it + # it does want a trailing ';' but not a trailing '/'. However, these + # characters must be included in the original query in case the query + # is being passed to SQL*Plus. + if query.endswith(';') or query.endswith('/'): + query = query[:-1] + query = smart_str(query, self.charset) % tuple(args) return Database.Cursor.execute(self, query, params) def executemany(self, query, params=None): - query, params = self._rewrite_args(query, params) - return Database.Cursor.executemany(self, query, params) + try: + args = [(':arg%d' % i) for i in range(len(params[0]))] + except (IndexError, TypeError): + # No params given, nothing to do + return None + # cx_Oracle wants no trailing ';' for SQL statements. For PL/SQL, it + # it does want a trailing ';' but not a trailing '/'. However, these + # characters must be included in the original query in case the query + # is being passed to SQL*Plus. + if query.endswith(';') or query.endswith('/'): + query = query[:-1] + query = smart_str(query, self.charset) % tuple(args) + new_param_list = [self._format_params(i) for i in params] + return Database.Cursor.executemany(self, query, new_param_list) def fetchone(self): return to_unicode(Database.Cursor.fetchone(self)) diff --git a/django/db/backends/sqlite3/base.py b/django/db/backends/sqlite3/base.py index a482a240cf..b4b445cd16 100644 --- a/django/db/backends/sqlite3/base.py +++ b/django/db/backends/sqlite3/base.py @@ -133,8 +133,12 @@ class SQLiteCursorWrapper(Database.Cursor): return Database.Cursor.execute(self, query, params) def executemany(self, query, param_list): - query = self.convert_query(query, len(param_list[0])) - return Database.Cursor.executemany(self, query, param_list) + try: + query = self.convert_query(query, len(param_list[0])) + return Database.Cursor.executemany(self, query, param_list) + except (IndexError,TypeError): + # No parameter list provided + return None def convert_query(self, query, num_params): return query % tuple("?" * num_params)