Fixed insert/update handling when no database interaction is required.

Fixed #10205 as part of this.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@9926 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
Malcolm Tredinnick 2009-03-01 01:56:59 +00:00
parent bbea457fbb
commit c6a404d1e9
3 changed files with 13 additions and 5 deletions

View File

@ -2012,9 +2012,11 @@ class BaseQuery(object):
iterator over the results if the result_type is MULTI. iterator over the results if the result_type is MULTI.
result_type is either MULTI (use fetchmany() to retrieve all rows), result_type is either MULTI (use fetchmany() to retrieve all rows),
SINGLE (only retrieve a single row), or None (no results expected, but SINGLE (only retrieve a single row), or None. In this last case, the
the cursor is returned, since it's used by subclasses such as cursor is returned if any query is executed, since it's used by
InsertQuery). subclasses such as InsertQuery). It's possible, however, that no query
is needed, as the filters describe an empty set. In that case, None is
returned, to avoid any unnecessary database interaction.
""" """
try: try:
sql, params = self.as_sql() sql, params = self.as_sql()

View File

@ -117,7 +117,7 @@ class UpdateQuery(Query):
tables, but their rowcounts are not returned). tables, but their rowcounts are not returned).
""" """
cursor = super(UpdateQuery, self).execute_sql(result_type) cursor = super(UpdateQuery, self).execute_sql(result_type)
rows = cursor.rowcount rows = cursor and cursor.rowcount or 0
del cursor del cursor
for query in self.get_related_updates(): for query in self.get_related_updates():
query.execute_sql(result_type) query.execute_sql(result_type)
@ -315,7 +315,7 @@ class InsertQuery(Query):
def execute_sql(self, return_id=False): def execute_sql(self, return_id=False):
cursor = super(InsertQuery, self).execute_sql(None) cursor = super(InsertQuery, self).execute_sql(None)
if return_id: if return_id and cursor:
return self.connection.ops.last_insert_id(cursor, return self.connection.ops.last_insert_id(cursor,
self.model._meta.db_table, self.model._meta.pk.column) self.model._meta.db_table, self.model._meta.pk.column)

View File

@ -1081,6 +1081,12 @@ outer joins, so that all results are included.
>>> _ = Plaything.objects.create(name="p1") >>> _ = Plaything.objects.create(name="p1")
>>> Plaything.objects.all() >>> Plaything.objects.all()
[<Plaything: p1>] [<Plaything: p1>]
Bug #10205 -- When bailing out early because of an empty "__in" filter, we need
to set things up correctly internally so that subqueries can continue properly.
>>> Tag.objects.filter(name__in=()).update(name="foo")
0
"""} """}
# In Python 2.3 and the Python 2.6 beta releases, exceptions raised in __len__ # In Python 2.3 and the Python 2.6 beta releases, exceptions raised in __len__