[Checkins]
SVN: z3c.zalchemy/branches/ctheune-sqlalchemy04-experiment/src/z3c/zalchemy/
Some changes according to SQLAlchemy 0.4
Christian Theune
ct at gocept.com
Tue Sep 11 16:44:56 EDT 2007
Log message for revision 79578:
Some changes according to SQLAlchemy 0.4
Changed:
U z3c.zalchemy/branches/ctheune-sqlalchemy04-experiment/src/z3c/zalchemy/README.txt
U z3c.zalchemy/branches/ctheune-sqlalchemy04-experiment/src/z3c/zalchemy/container.py
U z3c.zalchemy/branches/ctheune-sqlalchemy04-experiment/src/z3c/zalchemy/datamanager.py
U z3c.zalchemy/branches/ctheune-sqlalchemy04-experiment/src/z3c/zalchemy/demo/demo_1/message.py
U z3c.zalchemy/branches/ctheune-sqlalchemy04-experiment/src/z3c/zalchemy/demo/demo_2/message.py
U z3c.zalchemy/branches/ctheune-sqlalchemy04-experiment/src/z3c/zalchemy/demo/demo_3/message.py
U z3c.zalchemy/branches/ctheune-sqlalchemy04-experiment/src/z3c/zalchemy/demo/demo_4/message.py
U z3c.zalchemy/branches/ctheune-sqlalchemy04-experiment/src/z3c/zalchemy/intid/keyreference.py
U z3c.zalchemy/branches/ctheune-sqlalchemy04-experiment/src/z3c/zalchemy/intid/keyreference.txt
U z3c.zalchemy/branches/ctheune-sqlalchemy04-experiment/src/z3c/zalchemy/tests/TRANSACTION.txt
U z3c.zalchemy/branches/ctheune-sqlalchemy04-experiment/src/z3c/zalchemy/tests/environ.py
U z3c.zalchemy/branches/ctheune-sqlalchemy04-experiment/src/z3c/zalchemy/tests/test_container.py
-=-
Modified: z3c.zalchemy/branches/ctheune-sqlalchemy04-experiment/src/z3c/zalchemy/README.txt
===================================================================
--- z3c.zalchemy/branches/ctheune-sqlalchemy04-experiment/src/z3c/zalchemy/README.txt 2007-09-11 20:31:39 UTC (rev 79577)
+++ z3c.zalchemy/branches/ctheune-sqlalchemy04-experiment/src/z3c/zalchemy/README.txt 2007-09-11 20:44:56 UTC (rev 79578)
@@ -66,6 +66,7 @@
need to call z3c.zalchemy.metadata.
>>> import sqlalchemy
+ >>> import sqlalchemy.orm
>>> import z3c.zalchemy
>>> table3 = sqlalchemy.Table(
... 'table3',
@@ -82,7 +83,7 @@
Now we map the table to our class.
- >>> sqlalchemy.mapper(A, table3) is not None
+ >>> sqlalchemy.orm.mapper(A, table3) is not None
True
To let zalchemy do its work we need to register our database utility.
@@ -156,7 +157,7 @@
>>> class B(object):
... pass
- >>> B.mapper = sqlalchemy.mapper(B, bTable)
+ >>> B.mapper = sqlalchemy.orm.mapper(B, bTable)
Assign bTable to the new engine and create the table.
This time we do it inside of a session.
@@ -183,7 +184,7 @@
>>> class Aa(object):
... pass
- >>> sqlalchemy.mapper(Aa, table3) is not None
+ >>> sqlalchemy.orm.mapper(Aa, table3) is not None
True
Now we can assign the class to the engine :
Modified: z3c.zalchemy/branches/ctheune-sqlalchemy04-experiment/src/z3c/zalchemy/container.py
===================================================================
--- z3c.zalchemy/branches/ctheune-sqlalchemy04-experiment/src/z3c/zalchemy/container.py 2007-09-11 20:31:39 UTC (rev 79577)
+++ z3c.zalchemy/branches/ctheune-sqlalchemy04-experiment/src/z3c/zalchemy/container.py 2007-09-11 20:44:56 UTC (rev 79578)
@@ -127,7 +127,7 @@
return self[name]
except KeyError:
return default
-
+
def __contains__(self, name):
return self.get(name) is not None
@@ -153,9 +153,8 @@
session.flush()
def _toStringIdentifier(self, obj):
- session = z3c.zalchemy.getSession()
- mapper = session.mapper(obj.__class__)
- instance_key = mapper.instance_key(obj)
+ mapper = sqlalchemy.orm.class_mapper(obj.__class__)
+ instance_key = mapper.identity_key_from_instance(obj)
ident = '-'.join(map(str, instance_key[1]))
return '%s-%s'%(instance_key[0].__name__, ident)
Modified: z3c.zalchemy/branches/ctheune-sqlalchemy04-experiment/src/z3c/zalchemy/datamanager.py
===================================================================
--- z3c.zalchemy/branches/ctheune-sqlalchemy04-experiment/src/z3c/zalchemy/datamanager.py 2007-09-11 20:31:39 UTC (rev 79577)
+++ z3c.zalchemy/branches/ctheune-sqlalchemy04-experiment/src/z3c/zalchemy/datamanager.py 2007-09-11 20:44:56 UTC (rev 79578)
@@ -24,10 +24,11 @@
from interfaces import IAlchemyEngineUtility
import sqlalchemy
+import sqlalchemy.orm
from sqlalchemy.orm.mapper import global_extensions
-from sqlalchemy.ext.sessioncontext import SessionContext
-from sqlalchemy.orm.session import Session
+from sqlalchemy.orm import scoped_session, sessionmaker
+
class AlchemyEngineUtility(persistent.Persistent):
"""A utility providing a database engine.
"""
@@ -85,7 +86,7 @@
if util is None:
raise ValueError("No engine utility registered")
engine = util.getEngine()
- session = sqlalchemy.create_session(bind_to=engine)
+ session = SessionFactory(bind=engine)
# This session is now only bound to the default engine. We need to bind
# the other explicitly bound tables and classes as well.
@@ -94,7 +95,10 @@
transaction.get().join(AlchemyDataManager(session))
return session
+SessionFactory = sessionmaker(autoflush=True, transactional=True)
+Session = scoped_session(createSession)
+
def bind_session(session):
"""Applies all table and class bindings to the given session."""
for table, engine in _tableToEngine.items():
@@ -103,12 +107,8 @@
_assignClass(class_, engine, session)
-ctx = SessionContext(createSession)
-global_extensions.append(ctx.mapper_extension)
-
-
def getSession():
- return ctx.current
+ return Session()
def getEngineForTable(t):
@@ -154,7 +154,7 @@
t = metadata.getTable(engine, table, True)
util = getUtility(IAlchemyEngineUtility, name=engine)
if session is None:
- session = ctx.current
+ session = Session()
session.bind_table(t, util.getEngine())
@@ -162,7 +162,7 @@
m = sqlalchemy.orm.class_mapper(class_)
util = getUtility(IAlchemyEngineUtility, name=engine)
if session is None:
- session = ctx.current
+ session = Session()
session.bind_mapper(m,util.getEngine())
@@ -204,12 +204,12 @@
self.transaction.rollback()
self._cleanup()
- def tpc_begin(self, trans):
- pass
-
def commit(self, trans):
self.session.flush()
+ def tpc_begin(self, trans):
+ pass
+
def tpc_vote(self, trans):
pass
@@ -229,8 +229,7 @@
return AlchemySavepoint()
def _cleanup(self):
- self.session.clear()
- del ctx.current
+ Session.remove()
class AlchemySavepoint(object):
Modified: z3c.zalchemy/branches/ctheune-sqlalchemy04-experiment/src/z3c/zalchemy/demo/demo_1/message.py
===================================================================
--- z3c.zalchemy/branches/ctheune-sqlalchemy04-experiment/src/z3c/zalchemy/demo/demo_1/message.py 2007-09-11 20:31:39 UTC (rev 79577)
+++ z3c.zalchemy/branches/ctheune-sqlalchemy04-experiment/src/z3c/zalchemy/demo/demo_1/message.py 2007-09-11 20:44:56 UTC (rev 79578)
@@ -1,11 +1,14 @@
import sqlalchemy
-import z3c.zalchemy
+import sqlalchemy.orm
+
+from zope.component.factory import Factory
from zope.interface import implements
from zope.schema.fieldproperty import FieldProperty
+import z3c.zalchemy
+
from interfaces import IHelloWorldMessage
-from zope.component.factory import Factory
# Define and create the table object for storing messages
HelloWorldMessageTable = sqlalchemy.Table(
@@ -31,7 +34,7 @@
# Map the table to the class
-sqlalchemy.mapper(HelloWorldMessage, HelloWorldMessageTable)
+sqlalchemy.orm.mapper(HelloWorldMessage, HelloWorldMessageTable)
messageFactory=Factory(
HelloWorldMessage,
Modified: z3c.zalchemy/branches/ctheune-sqlalchemy04-experiment/src/z3c/zalchemy/demo/demo_2/message.py
===================================================================
--- z3c.zalchemy/branches/ctheune-sqlalchemy04-experiment/src/z3c/zalchemy/demo/demo_2/message.py 2007-09-11 20:31:39 UTC (rev 79577)
+++ z3c.zalchemy/branches/ctheune-sqlalchemy04-experiment/src/z3c/zalchemy/demo/demo_2/message.py 2007-09-11 20:44:56 UTC (rev 79578)
@@ -1,12 +1,13 @@
import sqlalchemy
-import z3c.zalchemy
+import sqlalchemy.orm
+from zope.component.factory import Factory
from zope.interface import implements
from zope.schema.fieldproperty import FieldProperty
+import z3c.zalchemy
from interfaces import IHelloWorldMessage2
-from zope.component.factory import Factory
# define and create the RDBMS table for storing messages
HelloWorldMessageTable2 = sqlalchemy.Table(
@@ -29,7 +30,7 @@
self.who = who
# Map the message class to the message table
-messagemapper = sqlalchemy.mapper(HelloWorldMessage2, HelloWorldMessageTable2)
+messagemapper = sqlalchemy.orm.mapper(HelloWorldMessage2, HelloWorldMessageTable2)
messageFactory=Factory(
HelloWorldMessage2,
Modified: z3c.zalchemy/branches/ctheune-sqlalchemy04-experiment/src/z3c/zalchemy/demo/demo_3/message.py
===================================================================
--- z3c.zalchemy/branches/ctheune-sqlalchemy04-experiment/src/z3c/zalchemy/demo/demo_3/message.py 2007-09-11 20:31:39 UTC (rev 79577)
+++ z3c.zalchemy/branches/ctheune-sqlalchemy04-experiment/src/z3c/zalchemy/demo/demo_3/message.py 2007-09-11 20:44:56 UTC (rev 79578)
@@ -1,6 +1,7 @@
from datetime import datetime
import sqlalchemy
+import sqlalchemy.orm
import z3c.zalchemy
@@ -66,7 +67,7 @@
self.modified = modified
# Map the metadata table to the metadata class
-relationalmapper = sqlalchemy.mapper(RelationalDC, RelationalDCTable)
+relationalmapper = sqlalchemy.orm.mapper(RelationalDC, RelationalDCTable)
# The class defining the adapter between the message object and the
# IZopeDublinCore interface.
@@ -112,8 +113,8 @@
description = property(getDescription, setDescription,
doc="RelationalDC description")
-
-
+
+
# The class defining the message object
class HelloWorldMessage3(object):
implements(IHelloWorldMessage3)
@@ -128,10 +129,10 @@
# map the message class to the message table
-messagemapper = sqlalchemy.mapper(HelloWorldMessage3, HelloWorldMessageTable3)
+messagemapper = sqlalchemy.orm.mapper(HelloWorldMessage3, HelloWorldMessageTable3)
# add an additional property to the message mapper that maps
# to the metadata class
-messagemapper.add_property('rdc', sqlalchemy.relation(RelationalDC,
+messagemapper.add_property('rdc', sqlalchemy.orm.relation(RelationalDC,
cascade="all"))
messageFactory=Factory(
Modified: z3c.zalchemy/branches/ctheune-sqlalchemy04-experiment/src/z3c/zalchemy/demo/demo_4/message.py
===================================================================
--- z3c.zalchemy/branches/ctheune-sqlalchemy04-experiment/src/z3c/zalchemy/demo/demo_4/message.py 2007-09-11 20:31:39 UTC (rev 79577)
+++ z3c.zalchemy/branches/ctheune-sqlalchemy04-experiment/src/z3c/zalchemy/demo/demo_4/message.py 2007-09-11 20:44:56 UTC (rev 79578)
@@ -1,6 +1,7 @@
from datetime import datetime
import sqlalchemy
+import sqlalchemy.orm
import z3c.zalchemy
from z3c.zalchemy.container import contained
@@ -57,7 +58,7 @@
class RelationalDC(object):
-
+
creators = FieldProperty(IZopeDublinCore['creators'])
title = FieldProperty(IZopeDublinCore['title'])
description = FieldProperty(IZopeDublinCore['description'])
@@ -78,9 +79,9 @@
else:
self.modified = modified
-
-relationalmapper = sqlalchemy.mapper(RelationalDC, RelationalDCTable)
+relationalmapper = sqlalchemy.orm.mapper(RelationalDC, RelationalDCTable)
+
class RelationalDCAdapter(object):
adapts(IHelloWorldMessage4)
implements(IZopeDublinCore)
@@ -120,7 +121,6 @@
description = property(getDescription, setDescription,
doc="RelationalDC description")
-
class HelloWorldFragment(Contained):
@@ -131,7 +131,7 @@
def __init__(self, what):
self.what = what
-fragmentmapper = sqlalchemy.mapper(HelloWorldFragment, HelloWorldFragmentTable)
+fragmentmapper = sqlalchemy.orm.mapper(HelloWorldFragment, HelloWorldFragmentTable)
class HelloWorldMessage4(Contained):
@@ -210,11 +210,11 @@
return session.query(HelloWorldFragment).get_by(id=ident)
-messagemapper = sqlalchemy.mapper(HelloWorldMessage4, HelloWorldMessageTable4)
-messagemapper.add_property('rdc', sqlalchemy.relation(RelationalDC,
+messagemapper = sqlalchemy.orm.mapper(HelloWorldMessage4, HelloWorldMessageTable4)
+messagemapper.add_property('rdc', sqlalchemy.orm.relation(RelationalDC,
cascade="all"))
messagemapper.add_property('fragments',
- sqlalchemy.relation(HelloWorldFragment,
+ sqlalchemy.orm.relation(HelloWorldFragment,
cascade="all"))
messageFactory=Factory(
Modified: z3c.zalchemy/branches/ctheune-sqlalchemy04-experiment/src/z3c/zalchemy/intid/keyreference.py
===================================================================
--- z3c.zalchemy/branches/ctheune-sqlalchemy04-experiment/src/z3c/zalchemy/intid/keyreference.py 2007-09-11 20:31:39 UTC (rev 79577)
+++ z3c.zalchemy/branches/ctheune-sqlalchemy04-experiment/src/z3c/zalchemy/intid/keyreference.py 2007-09-11 20:44:56 UTC (rev 79578)
@@ -23,11 +23,15 @@
from z3c.zalchemy.interfaces import ISQLAlchemyObject
import z3c.zalchemy
+import sqlalchemy.orm
+
+
class RefToSQLAlchemyObject(object):
-
"""An IKeyReference for objects stored in an sql database by
- zalchemy whith a mapper attached to the class"""
-
+ zalchemy whith a mapper attached to the class.
+
+ """
+
interface.implements(zope.app.keyreference.interfaces.IKeyReference)
component.adapts(ISQLAlchemyObject)
@@ -35,18 +39,17 @@
def __init__(self, object):
object = removeSecurityProxy(object)
- session = z3c.zalchemy.getSession()
- mapper = session.mapper(object.__class__)
- self.ident = mapper.instance_key(object)[:2]
- self._class,self.pk = self.ident
-
+ mapper = sqlalchemy.orm.class_mapper(object.__class__)
+ self.ident = mapper.identity_key_from_instance(object)[:2]
+ self._class, self.pk = self.ident
+
def __call__(self):
session = z3c.zalchemy.getSession()
- return session.get(self._class,self.pk)
+ return session.get(self._class, self.pk)
def __hash__(self):
return hash(self.ident)
-
+
def __cmp__(self, other):
if self.key_type_id == other.key_type_id:
return cmp(self.ident,other.ident)
Modified: z3c.zalchemy/branches/ctheune-sqlalchemy04-experiment/src/z3c/zalchemy/intid/keyreference.txt
===================================================================
--- z3c.zalchemy/branches/ctheune-sqlalchemy04-experiment/src/z3c/zalchemy/intid/keyreference.txt 2007-09-11 20:31:39 UTC (rev 79577)
+++ z3c.zalchemy/branches/ctheune-sqlalchemy04-experiment/src/z3c/zalchemy/intid/keyreference.txt 2007-09-11 20:44:56 UTC (rev 79578)
@@ -9,10 +9,10 @@
>>> from z3c.zalchemy.intid.keyreference import RefToSQLAlchemyObject
>>> component.provideAdapter(RefToSQLAlchemyObject)
-
Let's create a simple mapper and an according class.
>>> import sqlalchemy
+ >>> import sqlalchemy.orm
>>> import z3c.zalchemy
>>> aTable = sqlalchemy.Table(
... 'aTable',z3c.zalchemy.metadata(),
@@ -27,9 +27,9 @@
>>> class A(object):
... interface.implements(ISQLAlchemyObject)
... pass
- >>> sqlalchemy.mapper(A, aTable) is not None
+ >>> sqlalchemy.orm.mapper(A, aTable) is not None
True
-
+
>>> z3c.zalchemy.createTable('aTable', '')
Start a transaction.
@@ -38,13 +38,11 @@
>>> txn = transaction.begin()
>>> session = z3c.zalchemy.getSession()
-
>>> a = A()
>>> session.save(a)
>>> a.id = 1
>>> a.value = 1
-
Now let us create a reference to the object
>>> from zope.app.keyreference.interfaces import IKeyReference
@@ -59,10 +57,10 @@
>>> ref1 == ref2
True
-We have not commited, our transaction therefore the ref returns None
+We have not committed our transaction, therefore the reference returns None
because it is not in the database.
- >>> ref1() is None
+ >>> ref1() is a
True
>>> transaction.commit()
@@ -74,8 +72,7 @@
>>> a2.value
1
-
+
>>> ref3 = IKeyReference(a2)
>>> ref3 == ref2 == ref1
True
-
Modified: z3c.zalchemy/branches/ctheune-sqlalchemy04-experiment/src/z3c/zalchemy/tests/TRANSACTION.txt
===================================================================
--- z3c.zalchemy/branches/ctheune-sqlalchemy04-experiment/src/z3c/zalchemy/tests/TRANSACTION.txt 2007-09-11 20:31:39 UTC (rev 79577)
+++ z3c.zalchemy/branches/ctheune-sqlalchemy04-experiment/src/z3c/zalchemy/tests/TRANSACTION.txt 2007-09-11 20:44:56 UTC (rev 79578)
@@ -19,6 +19,7 @@
Setup a sqlalchemy table and class :
>>> import sqlalchemy
+ >>> import sqlalchemy.orm
>>> import z3c.zalchemy
>>> table2 = sqlalchemy.Table(
... 'table2',
@@ -29,7 +30,7 @@
... )
>>> class A(object):
... pass
- >>> A.mapper = sqlalchemy.mapper(A, table2)
+ >>> A.mapper = sqlalchemy.orm.mapper(A, table2)
Now start a zope transaction :
Modified: z3c.zalchemy/branches/ctheune-sqlalchemy04-experiment/src/z3c/zalchemy/tests/environ.py
===================================================================
--- z3c.zalchemy/branches/ctheune-sqlalchemy04-experiment/src/z3c/zalchemy/tests/environ.py 2007-09-11 20:31:39 UTC (rev 79577)
+++ z3c.zalchemy/branches/ctheune-sqlalchemy04-experiment/src/z3c/zalchemy/tests/environ.py 2007-09-11 20:44:56 UTC (rev 79578)
@@ -12,9 +12,11 @@
#
##############################################################################
-import z3c.zalchemy
import sqlalchemy
+import sqlalchemy.orm
+import z3c.zalchemy
+
testTable = sqlalchemy.Table(
'testTable',
z3c.zalchemy.metadata(),
@@ -33,5 +35,5 @@
class mappedTestClass(object):
pass
-sqlalchemy.mapper(mappedTestClass, testTable)
+sqlalchemy.orm.mapper(mappedTestClass, testTable)
Modified: z3c.zalchemy/branches/ctheune-sqlalchemy04-experiment/src/z3c/zalchemy/tests/test_container.py
===================================================================
--- z3c.zalchemy/branches/ctheune-sqlalchemy04-experiment/src/z3c/zalchemy/tests/test_container.py 2007-09-11 20:31:39 UTC (rev 79577)
+++ z3c.zalchemy/branches/ctheune-sqlalchemy04-experiment/src/z3c/zalchemy/tests/test_container.py 2007-09-11 20:44:56 UTC (rev 79578)
@@ -18,6 +18,7 @@
from zope.app.testing.placelesssetup import PlacelessSetup
import sqlalchemy
+import sqlalchemy.orm
import z3c.zalchemy
@@ -31,7 +32,7 @@
class SQLTestSingle(object):
pass
-sqlalchemy.mapper(SQLTestSingle, singlePrimaryKeyTable)
+sqlalchemy.orm.mapper(SQLTestSingle, singlePrimaryKeyTable)
multiPrimaryKeyTable = sqlalchemy.Table(
@@ -47,7 +48,7 @@
self.id1 = id1
self.id2 = id2
-sqlalchemy.mapper(SQLTestMulti, multiPrimaryKeyTable)
+sqlalchemy.orm.mapper(SQLTestMulti, multiPrimaryKeyTable)
def setUp(test):
More information about the Checkins
mailing list