Commit c6a404d1 authored by Malcolm Tredinnick's avatar Malcolm Tredinnick
Browse files

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
parent bbea457f
Loading
Loading
Loading
Loading
+5 −3
Original line number Diff line number Diff line
@@ -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()
+2 −2
Original line number Diff line number Diff line
@@ -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)

+6 −0
Original line number Diff line number Diff line
@@ -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__