From: Mike Bayer Date: Mon, 7 Feb 2011 18:30:27 +0000 (-0500) Subject: - Session constructor emits a warning when autoflush=True X-Git-Tag: rel_0_7b1~30 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ae5b58d9a5b03b71d2c22d410d1d94f8361b99f0;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git - Session constructor emits a warning when autoflush=True or expire_on_commit=True when autocommit=True. [ticket:2041] --- diff --git a/CHANGES b/CHANGES index b2aff3488a..0e4e0c8ca8 100644 --- 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] diff --git a/lib/sqlalchemy/orm/session.py b/lib/sqlalchemy/orm/session.py index 4f51d04c65..b0593ec690 100644 --- a/lib/sqlalchemy/orm/session.py +++ b/lib/sqlalchemy/orm/session.py @@ -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) diff --git a/test/orm/test_dynamic.py b/test/orm/test_dynamic.py index ff157407a5..409615c399 100644 --- a/test/orm/test_dynamic.py +++ b/test/orm/test_dynamic.py @@ -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') diff --git a/test/orm/test_events.py b/test/orm/test_events.py index 25f94e487a..3c467909a7 100644 --- a/test/orm/test_events.py +++ b/test/orm/test_events.py @@ -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) diff --git a/test/orm/test_merge.py b/test/orm/test_merge.py index d07efd9871..34494b9789 100644 --- a/test/orm/test_merge.py +++ b/test/orm/test_merge.py @@ -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')]) diff --git a/test/orm/test_session.py b/test/orm/test_session.py index c3f6dcd71a..8d51dac118 100644 --- a/test/orm/test_session.py +++ b/test/orm/test_session.py @@ -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) diff --git a/test/orm/test_transaction.py b/test/orm/test_transaction.py index d27bf1af29..a89c5f4b24 100644 --- a/test/orm/test_transaction.py +++ b/test/orm/test_transaction.py @@ -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()