]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
document rowcount for ORM update/delete
authorMike Bayer <mike_mp@zzzcomputing.com>
Wed, 31 Mar 2021 13:39:34 +0000 (09:39 -0400)
committerMike Bayer <mike_mp@zzzcomputing.com>
Wed, 31 Mar 2021 13:42:47 +0000 (09:42 -0400)
Change-Id: I16f50cb50fc3cccc1bd7cae3a64a085b1ea68612

doc/build/orm/session_basics.rst
doc/build/tutorial/data.rst
lib/sqlalchemy/engine/cursor.py
test/orm/test_update_delete.py

index 0ea797fa9511ef8c17a43730e2597166c49a76ca..a5620ef6ec181776ed07e4297d50f5f36a2013ba 100644 (file)
@@ -559,11 +559,17 @@ Core :class:`_sql.Update` construct::
     stmt = update(User).where(User.name == "squidward").values(name="spongebob").\
         execution_options(synchronize_session="fetch")
 
-    session.execute(stmt)
+    result = session.execute(stmt)
 
 Above, the :meth:`_dml.Update.execution_options` method may be used to
 establish execution-time options such as "synchronize_session".
 
+The result object returned is an instance of :class:`_result.CursorResult`; to
+retrieve the number of rows matched by any UPDATE or DELETE statement, use
+:attr:`_result.CursorResult.rowcount`::
+
+    num_rows_matched = result.rowcount
+
 DELETEs work in the same way as UPDATE except there is no "values / set"
 clause established.  When synchronize_session is used, matching objects
 within the :class:`_orm.Session` will be marked as deleted and expunged.
index a658a7db796c67240d985e25254b5c45d23fcd4a..f5009df58109dcd257f13dd3778b108c937d3f9f 100644 (file)
@@ -1933,6 +1933,8 @@ syntaxes, such as ``DELETE FROM..USING`` on MySQL::
   {opensql}DELETE FROM user_account USING user_account, address
   WHERE user_account.id = address.user_id AND address.email_address = %s
 
+.. _tutorial_update_delete_rowcount:
+
 Getting Affected Row Count from UPDATE, DELETE
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
index 5a3b929018bc78dcd4a524357291f70944fa1b03..24a7cdb80363c4ff5d73201d668ad27f75f21c6e 100644 (file)
@@ -1620,7 +1620,12 @@ class BaseCursorResult(object):
            * Statements that use RETURNING may not return a correct
              rowcount.
 
-        """
+        .. seealso::
+
+            :ref:`tutorial_update_delete_rowcount` - in the :ref:`unified_tutorial`
+
+        """  # noqa E501
+
         try:
             return self.context.rowcount
         except BaseException as e:
index c9248b1189bdeee68aa7a9c0bef0abc5e44a6eb3..7586a1e2e58e57a571d6845e978ca81903680e04 100644 (file)
@@ -618,25 +618,27 @@ class UpdateDeleteTest(fixtures.MappedTest):
             sess.execute(select(User).order_by(User.id)).scalars().all()
         )
 
-        sess.execute(
+        result = sess.execute(
             update(User)
             .where(User.age > 29)
             .values({"age": User.age - 10})
             .execution_options(synchronize_session="evaluate"),
         )
 
+        eq_(result.rowcount, 2)
         eq_([john.age, jack.age, jill.age, jane.age], [25, 37, 29, 27])
         eq_(
             sess.execute(select(User.age).order_by(User.id)).all(),
             list(zip([25, 37, 29, 27])),
         )
 
-        sess.execute(
+        result = sess.execute(
             update(User)
             .where(User.age > 29)
             .values({User.age: User.age - 10})
-            .execution_options(synchronize_session="evaluate")
+            .execution_options(synchronize_session="fetch")
         )
+        eq_(result.rowcount, 1)
         eq_([john.age, jack.age, jill.age, jane.age], [25, 27, 29, 27])
         eq_(
             sess.query(User.age).order_by(User.id).all(),
@@ -874,10 +876,11 @@ class UpdateDeleteTest(fixtures.MappedTest):
                 .where(User.age > 29)
                 .values({"age": User.age - 10})
             )
-            sess.execute(
+            result = sess.execute(
                 stmt, execution_options={"synchronize_session": "fetch"}
             )
 
+            eq_(result.rowcount, 2)
             # these are simple values, these are now evaluated even with
             # the "fetch" strategy, new in 1.4, so there is no expiry
             eq_([john.age, jack.age, jill.age, jane.age], [25, 37, 29, 27])