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.
result_type is either MULTI (use fetchmany() to retrieve all rows),
SINGLE (only retrieve a single row), or None (no results expected, but
the cursor is returned, since it's used by subclasses such as
InsertQuery).
SINGLE (only retrieve a single row), or None. In this last case, the
cursor is returned if any query is executed, since it's used by
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:
sql, params = self.as_sql()

View File

@ -117,7 +117,7 @@ class UpdateQuery(Query):
tables, but their rowcounts are not returned).
"""
cursor = super(UpdateQuery, self).execute_sql(result_type)
rows = cursor.rowcount
rows = cursor and cursor.rowcount or 0
del cursor
for query in self.get_related_updates():
query.execute_sql(result_type)
@ -315,7 +315,7 @@ class InsertQuery(Query):
def execute_sql(self, return_id=False):
cursor = super(InsertQuery, self).execute_sql(None)
if return_id:
if return_id and cursor:
return self.connection.ops.last_insert_id(cursor,
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.all()
[<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__