[Checkins] SVN: zope.sqlalchemy/trunk/ SQLAlchemy 0.6.x support. Require SQLAlchemy >= 0.5.1.
Laurence Rowe
l at lrowe.co.uk
Mon Jun 7 11:38:31 EDT 2010
Log message for revision 113240:
SQLAlchemy 0.6.x support. Require SQLAlchemy >= 0.5.1.
Changed:
U zope.sqlalchemy/trunk/CHANGES.txt
U zope.sqlalchemy/trunk/setup.py
U zope.sqlalchemy/trunk/src/zope/sqlalchemy/README.txt
U zope.sqlalchemy/trunk/src/zope/sqlalchemy/datamanager.py
U zope.sqlalchemy/trunk/src/zope/sqlalchemy/tests.py
-=-
Modified: zope.sqlalchemy/trunk/CHANGES.txt
===================================================================
--- zope.sqlalchemy/trunk/CHANGES.txt 2010-06-07 15:31:50 UTC (rev 113239)
+++ zope.sqlalchemy/trunk/CHANGES.txt 2010-06-07 15:38:30 UTC (rev 113240)
@@ -4,6 +4,11 @@
0.5 (unreleased)
----------------
+* Remove redundant session.flush() / session.clear() on savepoint operations.
+ These were only needed with SQLAlchemy 0.4.x.
+
+* SQLAlchemy 0.6.x support. Require SQLAlchemy >= 0.5.1.
+
* Add support for running ``python setup.py test``.
* Pull in pysqlite explicitly as a test dependency.
Modified: zope.sqlalchemy/trunk/setup.py
===================================================================
--- zope.sqlalchemy/trunk/setup.py 2010-06-07 15:31:50 UTC (rev 113239)
+++ zope.sqlalchemy/trunk/setup.py 2010-06-07 15:38:30 UTC (rev 113240)
@@ -27,7 +27,7 @@
install_requires=[
'setuptools',
- 'SQLAlchemy>=0.4.7,!=0.5.0beta1,!=0.5.0beta2,!=0.5.0beta3,!=0.5.0rc1,!=0.5.0rc2,!=0.5.0rc3,!=0.5.0rc4,!=0.5.0', # or >=0.5.1
+ 'SQLAlchemy>=0.5.1',
'transaction',
'zope.interface',
],
Modified: zope.sqlalchemy/trunk/src/zope/sqlalchemy/README.txt
===================================================================
--- zope.sqlalchemy/trunk/src/zope/sqlalchemy/README.txt 2010-06-07 15:31:50 UTC (rev 113239)
+++ zope.sqlalchemy/trunk/src/zope/sqlalchemy/README.txt 2010-06-07 15:38:30 UTC (rev 113240)
@@ -71,19 +71,9 @@
scoped sessions. Zope and SQLAlchemy sessions are tied together by using the
ZopeTransactionExtension from this package.
- >>> if SA_0_5:
- ... Session = scoped_session(sessionmaker(bind=engine,
- ... twophase=TEST_TWOPHASE, extension=ZopeTransactionExtension()))
+ >>> Session = scoped_session(sessionmaker(bind=engine,
+ ... twophase=TEST_TWOPHASE, extension=ZopeTransactionExtension()))
-The exact arguments depend on the version. Under SQLAlchemy 0.4 we must also
-supply transactional=True (equivalent to autocommit=False, which is default
-under 0.5).
-
- >>> if SA_0_4:
- ... Session = scoped_session(sessionmaker(bind=engine,
- ... twophase=TEST_TWOPHASE, extension=ZopeTransactionExtension(),
- ... transactional=True, autoflush=True,))
-
Call the scoped session factory to retrieve a session. You may call this as
many times as you like within a transaction and you will always retrieve the
same session. At present there are no users in the database.
Modified: zope.sqlalchemy/trunk/src/zope/sqlalchemy/datamanager.py
===================================================================
--- zope.sqlalchemy/trunk/src/zope/sqlalchemy/datamanager.py 2010-06-07 15:31:50 UTC (rev 113239)
+++ zope.sqlalchemy/trunk/src/zope/sqlalchemy/datamanager.py 2010-06-07 15:38:30 UTC (rev 113240)
@@ -139,12 +139,10 @@
def __init__(self, session):
self.session = session
self.transaction = session.begin_nested()
- session.flush() # do I want to do this? Probably.
def rollback(self):
# no need to check validity, sqlalchemy should raise an exception. I think.
self.transaction.rollback()
- self.session.clear() # remove when Session.rollback does an attribute_manager.rollback
def join_transaction(session, initial_state=STATUS_ACTIVE):
Modified: zope.sqlalchemy/trunk/src/zope/sqlalchemy/tests.py
===================================================================
--- zope.sqlalchemy/trunk/src/zope/sqlalchemy/tests.py 2010-06-07 15:31:50 UTC (rev 113239)
+++ zope.sqlalchemy/trunk/src/zope/sqlalchemy/tests.py 2010-06-07 15:38:30 UTC (rev 113240)
@@ -37,10 +37,6 @@
TEST_TWOPHASE = bool(os.environ.get('TEST_TWOPHASE'))
TEST_DSN = os.environ.get('TEST_DSN', 'sqlite:///:memory:')
-SA_0_4 = sa.__version__.split('.')[:2] == ['0', '4']
-SA_0_5 = not SA_0_4
-
-
class SimpleModel(object):
def __init__(self, **kw):
for k, v in kw.items():
@@ -55,32 +51,16 @@
engine = sa.create_engine(TEST_DSN)
engine2 = sa.create_engine(TEST_DSN)
-if SA_0_4:
- Session = orm.scoped_session(orm.sessionmaker(
- bind=engine,
- extension=tx.ZopeTransactionExtension(),
- transactional=True,
- autoflush=True,
- twophase=TEST_TWOPHASE,
- ))
- UnboundSession = orm.scoped_session(orm.sessionmaker(
- extension=tx.ZopeTransactionExtension(),
- transactional=True,
- autoflush=True,
- twophase=TEST_TWOPHASE,
- ))
+Session = orm.scoped_session(orm.sessionmaker(
+ bind=engine,
+ extension=tx.ZopeTransactionExtension(),
+ twophase=TEST_TWOPHASE,
+ ))
+UnboundSession = orm.scoped_session(orm.sessionmaker(
+ extension=tx.ZopeTransactionExtension(),
+ twophase=TEST_TWOPHASE,
+ ))
-if SA_0_5:
- Session = orm.scoped_session(orm.sessionmaker(
- bind=engine,
- extension=tx.ZopeTransactionExtension(),
- twophase=TEST_TWOPHASE,
- ))
- UnboundSession = orm.scoped_session(orm.sessionmaker(
- extension=tx.ZopeTransactionExtension(),
- twophase=TEST_TWOPHASE,
- ))
-
metadata = sa.MetaData() # best to use unbound metadata
test_users = sa.Table('test_users', metadata,
@@ -296,6 +276,27 @@
s1.rollback()
self.failIf(query.all(), "Users table should be empty")
+
+ def testRollbackAttributes(self):
+ use_savepoint = not engine.url.drivername in tx.NO_SAVEPOINT_SUPPORT
+ if not use_savepoint:
+ return # sqlite databases do not support savepoints
+
+ t = transaction.get()
+ session = Session()
+ query = session.query(User)
+ self.failIf(query.all(), "Users table should be empty")
+
+ s1 = t.savepoint()
+ user = User(id=1, firstname='udo', lastname='juergens')
+ session.add(user)
+ session.flush()
+
+ s2 = t.savepoint()
+ user.firstname='heino'
+ session.flush()
+ s2.rollback()
+ self.assertEqual(user.firstname, 'udo', "User firstname attribute should have been rolled back")
def testCommit(self):
session = Session()
@@ -439,8 +440,6 @@
raise thread_error # reraise in current thread
def testBulkDelete(self):
- if SA_0_4:
- return
session = Session()
session.add(User(id=1, firstname='udo', lastname='juergens'))
session.add(User(id=2, firstname='heino', lastname='n/a'))
@@ -452,8 +451,6 @@
self.assertEqual(len(results.fetchall()), 0)
def testBulkUpdate(self):
- if SA_0_4:
- return
session = Session()
session.add(User(id=1, firstname='udo', lastname='juergens'))
session.add(User(id=2, firstname='heino', lastname='n/a'))
@@ -506,5 +503,5 @@
for cls in (ZopeSQLAlchemyTests, MultipleEngineTests):
suite.addTest(makeSuite(cls))
suite.addTest(doctest.DocFileSuite('README.txt', optionflags=optionflags, tearDown=tearDownReadMe,
- globs={'TEST_DSN': TEST_DSN, 'TEST_TWOPHASE': TEST_TWOPHASE, 'SA_0_4': SA_0_4, 'SA_0_5': SA_0_5}))
+ globs={'TEST_DSN': TEST_DSN, 'TEST_TWOPHASE': TEST_TWOPHASE}))
return suite
More information about the checkins
mailing list