[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