]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- add notes for pyodbc limitations with rowcount fixes #3675
authorMike Bayer <mike_mp@zzzcomputing.com>
Tue, 15 Mar 2016 15:16:21 +0000 (11:16 -0400)
committerMike Bayer <mike_mp@zzzcomputing.com>
Tue, 15 Mar 2016 15:16:48 +0000 (11:16 -0400)
(cherry picked from commit 8bc370ed382a45654101fa34bac4a2886ce089c3)

lib/sqlalchemy/dialects/mssql/base.py
lib/sqlalchemy/dialects/mssql/pyodbc.py

index 40bca670eda33609ec2d2222d36261d1174d3640..544890eadde7bccc37d4b00e11e29d31adc65f2c 100644 (file)
@@ -337,6 +337,40 @@ Declarative form::
 This option can also be specified engine-wide using the
 ``implicit_returning=False`` argument on :func:`.create_engine`.
 
+.. _mssql_rowcount_versioning:
+
+Rowcount Support / ORM Versioning
+---------------------------------
+
+The SQL Server drivers have very limited ability to return the number
+of rows updated from an UPDATE or DELETE statement.  In particular, the
+pymssql driver has no support, whereas the pyodbc driver can only return
+this value under certain conditions.
+
+In particular, updated rowcount is not available when OUTPUT INSERTED
+is used.  This impacts the SQLAlchemy ORM's versioning feature when
+server-side versioning schemes are used.  When
+using pyodbc, the "implicit_returning" flag needs to be set to false
+for any ORM mapped class that uses a version_id column in conjunction with
+a server-side version generator::
+
+    class MyTable(Base):
+        __tablename__ = 'mytable'
+        id = Column(Integer, primary_key=True)
+        stuff = Column(String(10))
+        timestamp = Column(TIMESTAMP(), default=text('DEFAULT'))
+        __mapper_args__ = {
+            'version_id_col': timestamp,
+            'version_id_generator': False,
+        }
+        __table_args__ = {
+            'implicit_returning': False
+        }
+
+Without the implicit_returning flag above, the UPDATE statement will
+use ``OUTPUT inserted.timestamp`` and the rowcount will be returned as
+-1, causing the versioning logic to fail.
+
 Enabling Snapshot Isolation
 ---------------------------
 
index d901e0ee1c24fe9cc68ffed24db570859f838cce..36905004c1a7f2542d35fbb887a3621f2fdb5f7c 100644 (file)
@@ -110,6 +110,13 @@ for unix + PyODBC.
 .. versionadded:: 0.7.7
     ``supports_unicode_binds`` parameter to ``create_engine()``\ .
 
+Rowcount Support
+----------------
+
+Pyodbc only has partial support for rowcount.  See the notes at
+:ref:`mssql_rowcount_versioning` for important notes when using ORM
+versioning.
+
 """
 
 from .base import MSExecutionContext, MSDialect