[Checkins]
SVN: z3c.zalchemy/branches/engine-metadata/src/z3c/zalchemy/
Added the possibility to assign a table to an engine to be
able to use one
Jürgen Kartnaller
juergen at kartnaller.at
Fri Jan 19 02:57:08 EST 2007
Log message for revision 72102:
Added the possibility to assign a table to an engine to be able to use one
table name with different table definitions in different databases.
Changed:
U z3c.zalchemy/branches/engine-metadata/src/z3c/zalchemy/README.txt
U z3c.zalchemy/branches/engine-metadata/src/z3c/zalchemy/datamanager.py
U z3c.zalchemy/branches/engine-metadata/src/z3c/zalchemy/demo/demo_1/container.py
U z3c.zalchemy/branches/engine-metadata/src/z3c/zalchemy/intid/keyreference.txt
U z3c.zalchemy/branches/engine-metadata/src/z3c/zalchemy/tests/TRANSACTION.txt
U z3c.zalchemy/branches/engine-metadata/src/z3c/zalchemy/tests/environ.py
U z3c.zalchemy/branches/engine-metadata/src/z3c/zalchemy/tests/test_container.py
-=-
Modified: z3c.zalchemy/branches/engine-metadata/src/z3c/zalchemy/README.txt
===================================================================
--- z3c.zalchemy/branches/engine-metadata/src/z3c/zalchemy/README.txt 2007-01-19 07:51:04 UTC (rev 72101)
+++ z3c.zalchemy/branches/engine-metadata/src/z3c/zalchemy/README.txt 2007-01-19 07:57:07 UTC (rev 72102)
@@ -46,13 +46,14 @@
... )
We create our table as a normal SQLAlchemy table. The important thing
-here is, that the metadata from zalchemy must be used:
+here is, that the metadata from zalchemy must be used. Please note that you
+need to call z3c.zalchemy.metadata.
>>> import sqlalchemy
>>> import z3c.zalchemy
>>> table3 = sqlalchemy.Table(
... 'table3',
- ... z3c.zalchemy.metadata,
+ ... z3c.zalchemy.metadata(),
... sqlalchemy.Column('id', sqlalchemy.Integer,
... sqlalchemy.Sequence('atable_id'), primary_key=True),
... sqlalchemy.Column('value', sqlalchemy.Integer),
@@ -152,7 +153,7 @@
>>> bTable = sqlalchemy.Table(
... 'bTable',
- ... z3c.zalchemy.metadata,
+ ... z3c.zalchemy.metadata(),
... sqlalchemy.Column('id', sqlalchemy.Integer,
... sqlalchemy.Sequence('btable_id'), primary_key=True),
... sqlalchemy.Column('value', sqlalchemy.String),
@@ -212,3 +213,31 @@
>>> aa.value = 100
>>> transaction.commit()
+
+
+Tables With The Same Name In Different Databases
+------------------------------------------------
+
+IF we have two databases containing tables with the same name but with a
+different structure we need to assign a table explicitely to a database. This
+must be done by requesting metadata for a specific engine.
+
+ >>> b2Table = sqlalchemy.Table(
+ ... 'bTable',
+ ... z3c.zalchemy.metadata('b2Engine'),
+ ... sqlalchemy.Column('id', sqlalchemy.Integer,
+ ... sqlalchemy.Sequence('btable_id'), primary_key=True),
+ ... sqlalchemy.Column('b2value', sqlalchemy.String),
+ ... )
+
+We can now request the table by providing the engine.
+
+ >>> z3c.zalchemy.metadata.getTable('b2Engine', 'bTable', True)
+ Table('bTable',...
+
+If we have specified a table for the 'default' engine then we can request
+'bTable' for 'b2Engine' with a fallback to the default engine.
+
+ >>> z3c.zalchemy.metadata.getTable('b2Engine', 'table3', True)
+ Table('table3',...
+
Modified: z3c.zalchemy/branches/engine-metadata/src/z3c/zalchemy/datamanager.py
===================================================================
--- z3c.zalchemy/branches/engine-metadata/src/z3c/zalchemy/datamanager.py 2007-01-19 07:51:04 UTC (rev 72101)
+++ z3c.zalchemy/branches/engine-metadata/src/z3c/zalchemy/datamanager.py 2007-01-19 07:57:07 UTC (rev 72102)
@@ -60,9 +60,6 @@
self._v_storage = local()
return self._v_storage
-
-metadata = sqlalchemy.MetaData()
-
_tableToEngine = {}
_classToEngine = {}
_tablesToCreate = []
@@ -119,7 +116,7 @@
def _assignTable(table, engine):
if inSession():
- t = metadata.tables[table]
+ t = metadata.getTable(engine, table, True)
util = getUtility(IAlchemyEngineUtility, name=engine)
_storage.session.bind_table(t,util.getEngine())
@@ -142,7 +139,7 @@
def _doCreateTable(table, engine):
for t, tengine in _tableToEngine.iteritems():
if t==table:
- t = metadata.tables[table]
+ t = metadata.getTable(engine, table, True)
util = getUtility(IAlchemyEngineUtility, name=tengine)
try:
util.getEngine().create(t)
@@ -150,7 +147,7 @@
pass
return
util = getUtility(IAlchemyEngineUtility, name=engine)
- t = metadata.tables[table]
+ t = metadata.getTable(engine, table, True)
try:
util.getEngine().create(t)
except:
@@ -160,7 +157,7 @@
def dropTable(table, engine=''):
for t, tengine in _tableToEngine.iteritems():
if t==table:
- t = metadata.tables[table]
+ t = metadata.getTable(engine, table, True)
util = getUtility(IAlchemyEngineUtility, name=tengine)
try:
util.getEngine().drop(t)
@@ -168,7 +165,7 @@
pass
return
util = getUtility(IAlchemyEngineUtility, name=engine)
- t = metadata.tables[table]
+ t = metadata.getTable(engine, table, True)
try:
util.getEngine().drop(t)
except:
@@ -215,3 +212,31 @@
def sortKey(self):
return str(id(self))
+
+class MetaManager(object):
+ """A manager for metadata to be able to use the same table name in
+ different databases.
+ """
+
+ def __init__(self):
+ self.metadata = {}
+
+ def getTable(self, engine, table, fallback):
+ md = self.metadata.get(engine)
+ if md and table in md.tables:
+ return md.tables[table]
+ if fallback and engine:
+ md = self.metadata.get('')
+ if md and table in md.tables:
+ return md.tables[table]
+ return None
+
+ def __call__(self, engine=''):
+ md = self.metadata.get(engine)
+ if md is None:
+ md = self.metadata[engine] = sqlalchemy.MetaData()
+ return md
+
+
+metadata = MetaManager()
+
Modified: z3c.zalchemy/branches/engine-metadata/src/z3c/zalchemy/demo/demo_1/container.py
===================================================================
--- z3c.zalchemy/branches/engine-metadata/src/z3c/zalchemy/demo/demo_1/container.py 2007-01-19 07:51:04 UTC (rev 72101)
+++ z3c.zalchemy/branches/engine-metadata/src/z3c/zalchemy/demo/demo_1/container.py 2007-01-19 07:57:07 UTC (rev 72102)
@@ -9,6 +9,6 @@
"""A container for Hello World messages"""
implements(IMessageContainer)
def __init__(self):
+ super(MessageContainer, self).__init__(self)
self.setClassName('z3c.zalchemy.demo.demo_1.message.HelloWorldMessage')
-
Modified: z3c.zalchemy/branches/engine-metadata/src/z3c/zalchemy/intid/keyreference.txt
===================================================================
--- z3c.zalchemy/branches/engine-metadata/src/z3c/zalchemy/intid/keyreference.txt 2007-01-19 07:51:04 UTC (rev 72101)
+++ z3c.zalchemy/branches/engine-metadata/src/z3c/zalchemy/intid/keyreference.txt 2007-01-19 07:57:07 UTC (rev 72102)
@@ -15,7 +15,7 @@
>>> import sqlalchemy
>>> import z3c.zalchemy
>>> aTable = sqlalchemy.Table(
- ... 'aTable',z3c.zalchemy.metadata,
+ ... 'aTable',z3c.zalchemy.metadata(),
... sqlalchemy.Column('id', sqlalchemy.Integer, primary_key=True),
... sqlalchemy.Column('value', sqlalchemy.Integer),
... )
Modified: z3c.zalchemy/branches/engine-metadata/src/z3c/zalchemy/tests/TRANSACTION.txt
===================================================================
--- z3c.zalchemy/branches/engine-metadata/src/z3c/zalchemy/tests/TRANSACTION.txt 2007-01-19 07:51:04 UTC (rev 72101)
+++ z3c.zalchemy/branches/engine-metadata/src/z3c/zalchemy/tests/TRANSACTION.txt 2007-01-19 07:57:07 UTC (rev 72102)
@@ -22,7 +22,7 @@
>>> import z3c.zalchemy
>>> table2 = sqlalchemy.Table(
... 'table2',
- ... z3c.zalchemy.metadata,
+ ... z3c.zalchemy.metadata(),
... sqlalchemy.Column('id', sqlalchemy.Integer,
... sqlalchemy.Sequence('atable_id'), primary_key = True),
... sqlalchemy.Column('value', sqlalchemy.Integer),
Modified: z3c.zalchemy/branches/engine-metadata/src/z3c/zalchemy/tests/environ.py
===================================================================
--- z3c.zalchemy/branches/engine-metadata/src/z3c/zalchemy/tests/environ.py 2007-01-19 07:51:04 UTC (rev 72101)
+++ z3c.zalchemy/branches/engine-metadata/src/z3c/zalchemy/tests/environ.py 2007-01-19 07:57:07 UTC (rev 72102)
@@ -17,14 +17,14 @@
testTable = sqlalchemy.Table(
'testTable',
- z3c.zalchemy.metadata,
+ z3c.zalchemy.metadata(),
sqlalchemy.Column('id', sqlalchemy.Integer, primary_key = True),
sqlalchemy.Column('x', sqlalchemy.Integer),
)
illegalTable = sqlalchemy.Table(
'illegalTable',
- z3c.zalchemy.metadata,
+ z3c.zalchemy.metadata(),
sqlalchemy.Column('id', sqlalchemy.Integer, primary_key = True),
)
Modified: z3c.zalchemy/branches/engine-metadata/src/z3c/zalchemy/tests/test_container.py
===================================================================
--- z3c.zalchemy/branches/engine-metadata/src/z3c/zalchemy/tests/test_container.py 2007-01-19 07:51:04 UTC (rev 72101)
+++ z3c.zalchemy/branches/engine-metadata/src/z3c/zalchemy/tests/test_container.py 2007-01-19 07:57:07 UTC (rev 72102)
@@ -23,7 +23,7 @@
singlePrimaryKeyTable = sqlalchemy.Table(
'singlePrimaryKeyTable',
- z3c.zalchemy.metadata,
+ z3c.zalchemy.metadata(),
sqlalchemy.Column('id', sqlalchemy.Integer, primary_key = True),
sqlalchemy.Column('x', sqlalchemy.Integer),
)
@@ -36,7 +36,7 @@
multiPrimaryKeyTable = sqlalchemy.Table(
'multiPrimaryKeyTable',
- z3c.zalchemy.metadata,
+ z3c.zalchemy.metadata(),
sqlalchemy.Column('id1', sqlalchemy.Integer, primary_key = True),
sqlalchemy.Column('id2', sqlalchemy.String, primary_key = True),
sqlalchemy.Column('x', sqlalchemy.Integer),
More information about the Checkins
mailing list