or expire_on_commit=True when autocommit=True.
[ticket:2041]
- 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]
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)
'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'))
'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'))
'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'))
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')
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)
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')})
@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')])
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)
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()