]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- Session constructor emits a warning when autoflush=True
authorMike Bayer <mike_mp@zzzcomputing.com>
Mon, 7 Feb 2011 18:30:27 +0000 (13:30 -0500)
committerMike Bayer <mike_mp@zzzcomputing.com>
Mon, 7 Feb 2011 18:30:27 +0000 (13:30 -0500)
or expire_on_commit=True when autocommit=True.
[ticket:2041]

CHANGES
lib/sqlalchemy/orm/session.py
test/orm/test_dynamic.py
test/orm/test_events.py
test/orm/test_merge.py
test/orm/test_session.py
test/orm/test_transaction.py

diff --git a/CHANGES b/CHANGES
index b2aff3488a9bbc1fd05e8ef778e48b34e511472f..0e4e0c8ca824194c5611959edc85c464c8e171ff 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -39,6 +39,10 @@ CHANGES
   - Flushing of Orphans that have no parent is allowed
     [ticket:1912]
 
+  - Session constructor emits a warning when autoflush=True
+    or expire_on_commit=True when autocommit=True.
+    [ticket:2041]
+
   - Warnings generated when collection members, scalar referents 
     not part of the flush
     [ticket:1973]
index 4f51d04c653edd5e39d2cc67479c0465f62f3451..b0593ec690c26b904be6a1297ac930e0e3e97ef9 100644 (file)
@@ -508,6 +508,14 @@ class Session(object):
         self.twophase = twophase
         self._query_cls = query_cls
 
+        if autocommit:
+            if expire_on_commit and _enable_transaction_accounting:
+                util.warn("expire_on_commit=False is recommended with autocommit=True, "
+                            "else excessive SELECT statements may be emitted.")
+            if autoflush:
+                util.warn("autoflush=False is recommended with autocommit=True, "
+                            "else premature/excessive amounts of transaction commits may occur.")
+
         if extension:
             for ext in util.to_list(extension):
                 SessionExtension._adapt_listener(self, ext)
index ff157407a50beb034612afac24055c643e77cce5..409615c3993833958d17e4a0a6c004e1e000d913 100644 (file)
@@ -415,7 +415,7 @@ class SessionTest(_fixtures.FixtureTest):
             'addresses':dynamic_loader(mapper(Address, addresses), order_by=Address.id,
                                        backref='user')
         })
-        sess = create_session(autoflush=True)
+        sess = create_session(autoflush=True, autocommit=False)
         u = User(name='ed')
         u.addresses.append(Address(email_address='a'))
         u.addresses.append(Address(email_address='b'))
@@ -451,7 +451,7 @@ class SessionTest(_fixtures.FixtureTest):
             'addresses':dynamic_loader(mapper(Address, addresses), order_by=Address.id,
                                        backref='user', cascade="all, delete-orphan")
         })
-        sess = create_session(autoflush=True)
+        sess = create_session(autoflush=True, autocommit=False)
         u = User(name='ed')
         u.addresses.append(Address(email_address='a'))
         u.addresses.append(Address(email_address='b'))
@@ -487,7 +487,7 @@ class SessionTest(_fixtures.FixtureTest):
             'addresses':dynamic_loader(mapper(Address, addresses), order_by=Address.id,
                                        cascade="all, delete-orphan", backref='user')
         })
-        sess = create_session(autoflush=True)
+        sess = create_session(autoflush=True, autocommit=False)
         u = User(name='ed')
         u.addresses.append(Address(email_address='a'))
         u.addresses.append(Address(email_address='b'))
@@ -526,7 +526,7 @@ class SessionTest(_fixtures.FixtureTest):
         mapper(User, users, properties={
             'addresses':dynamic_loader(mapper(Address, addresses), backref='user')
         })
-        sess = create_session(autoflush=autoflush)
+        sess = create_session(autoflush=autoflush, autocommit=False)
 
         u = User(name='buffy')
 
index 25f94e487a9127cd6f16b1f8d6c82d1c8ba347ff..3c467909a70a98d50948aac97b3add6e2137824d 100644 (file)
@@ -501,7 +501,7 @@ class SessionEventsTest(_RemoveListeners, _fixtures.FixtureTest):
 
         mapper(User, users)
 
-        sess, canary = self._listener_fixture(autoflush=False, autocommit=True)
+        sess, canary = self._listener_fixture(autoflush=False, autocommit=True, expire_on_commit=False)
 
         u = User(name='u1')
         sess.add(u)
index d07efd9871622d412c009fc71104e13418b49444..34494b97895bf46d098048a833c15aed77939cab 100644 (file)
@@ -876,7 +876,7 @@ class MergeTest(_fixtures.FixtureTest):
     def test_cascade_doesnt_blowaway_manytoone(self):
         """a merge test that was fixed by [ticket:1202]"""
 
-        s = create_session(autoflush=True)
+        s = create_session(autoflush=True, autocommit=False)
         mapper(User, users, properties={
             'addresses':relationship(mapper(Address, addresses),backref='user')})
 
@@ -892,7 +892,7 @@ class MergeTest(_fixtures.FixtureTest):
 
     @testing.resolve_artifact_names
     def test_cascades_dont_autoflush(self):
-        sess = create_session(autoflush=True)
+        sess = create_session(autoflush=True, autocommit=False)
         m = mapper(User, users, properties={
             'addresses':relationship(mapper(Address, addresses),backref='user')})
         user = User(id=8, name='fred', addresses=[Address(email_address='user')])
index c3f6dcd71ab5cad49df6c511ae065678b5bf2824..8d51dac1188293fe3659a72277705adf386475bc 100644 (file)
@@ -250,6 +250,21 @@ class SessionTest(_fixtures.FixtureTest):
         eq_(bind.connect().execute("select count(1) from users").scalar(), 1)
         sess.close()
 
+    def test_autocommit_warnings(self):
+        assert_raises_message(
+            sa.exc.SAWarning,
+            "expire_on_commit=False is recommended with autocommit=True, "
+            "else excessive SELECT statements may be emitted.",
+            Session, autocommit=True, autoflush=False
+        )
+
+        assert_raises_message(
+            sa.exc.SAWarning,
+            "autoflush=False is recommended with autocommit=True, "
+            "else premature/excessive amounts of transaction commits may occur.",
+            Session, autocommit=True, expire_on_commit=False
+        )
+
     @testing.resolve_artifact_names
     def test_make_transient(self):
         mapper(User, users)
index d27bf1af29635e44a305763572ca1ca716297dca..a89c5f4b247d5f5ed9df199f977afadafa830bf4 100644 (file)
@@ -457,7 +457,8 @@ class AccountingFlagsTest(TransactionTest):
         sess.commit()
 
     def test_preflush_no_accounting(self):
-        sess = sessionmaker(_enable_transaction_accounting=False, autocommit=True)()
+        sess = Session(_enable_transaction_accounting=False, 
+                        autocommit=True, autoflush=False)
         u1 = User(name='ed')
         sess.add(u1)
         sess.flush()