[Checkins] SVN: megrok.rdb/trunk/src/megrok/rdb/ Allow setting the table explicitly.

Martijn Faassen faassen at startifact.com
Tue Jul 21 07:51:44 EDT 2009


Log message for revision 102053:
  Allow setting the table explicitly.
  

Changed:
  U   megrok.rdb/trunk/src/megrok/rdb/__init__.py
  U   megrok.rdb/trunk/src/megrok/rdb/directive.py
  U   megrok.rdb/trunk/src/megrok/rdb/meta.py
  A   megrok.rdb/trunk/src/megrok/rdb/tests/explicittable.py
  U   megrok.rdb/trunk/src/megrok/rdb/tests/test_rdb.py

-=-
Modified: megrok.rdb/trunk/src/megrok/rdb/__init__.py
===================================================================
--- megrok.rdb/trunk/src/megrok/rdb/__init__.py	2009-07-21 11:38:43 UTC (rev 102052)
+++ megrok.rdb/trunk/src/megrok/rdb/__init__.py	2009-07-21 11:51:43 UTC (rev 102053)
@@ -1,6 +1,6 @@
 from megrok.rdb.components import Model, Container, QueryContainer
 from megrok.rdb.schema import Fields
-from megrok.rdb.directive import (key, metadata, tablename, reflected,
+from megrok.rdb.directive import (key, metadata, tablename, reflected, table,
                                   tableargs, polymorphic_on, inherits,
                                   polymorphic_identity)
 from megrok.rdb.setup import setupDatabase

Modified: megrok.rdb/trunk/src/megrok/rdb/directive.py
===================================================================
--- megrok.rdb/trunk/src/megrok/rdb/directive.py	2009-07-21 11:38:43 UTC (rev 102052)
+++ megrok.rdb/trunk/src/megrok/rdb/directive.py	2009-07-21 11:51:43 UTC (rev 102053)
@@ -39,6 +39,11 @@
     store = ONCE
     default = None
 
+class table(Directive):
+    scope = CLASS
+    store = ONCE
+    default = None
+
 class tableargs(Directive):
     scope = CLASS
     store = ONCE

Modified: megrok.rdb/trunk/src/megrok/rdb/meta.py
===================================================================
--- megrok.rdb/trunk/src/megrok/rdb/meta.py	2009-07-21 11:38:43 UTC (rev 102052)
+++ megrok.rdb/trunk/src/megrok/rdb/meta.py	2009-07-21 11:51:43 UTC (rev 102053)
@@ -13,13 +13,19 @@
     martian.directive(rdb.tablename, get_default=default_tablename)
     martian.directive(rdb.metadata)
     martian.directive(rdb.reflected)
+    martian.directive(rdb.table)
     martian.directive(rdb.tableargs)
     martian.directive(rdb.inherits)
     martian.directive(rdb.polymorphic_identity)
     martian.directive(rdb.polymorphic_on)
     
-    def execute(self, class_, tablename, metadata, reflected, tableargs, inherits, polymorphic_identity, polymorphic_on, **kw):
-        class_.__tablename__ = tablename
+    def execute(self, class_, tablename, metadata, reflected, table,
+                tableargs, inherits, polymorphic_identity, polymorphic_on,
+                **kw):
+        if table is not None:
+            class_.__table__ = table
+        else:
+            class_.__tablename__ = tablename
         if tableargs is not None:
             class_.__table_args__ = tableargs
         
@@ -44,9 +50,9 @@
         try:
             instrument_declarative(class_, metadata._decl_registry, metadata)
         except sqlalchemy.exc.InvalidRequestError:
-            # XXX scary - catching too many errors
+            # FIXME scary - catching too many errors
             # allows re-grokking of classes that were already
-            # instrument. Better would be to un-instrument classes
+            # instrumented. Better would be to un-instrument classes
             # after tests, but how to uninstrument?
             pass
 

Added: megrok.rdb/trunk/src/megrok/rdb/tests/explicittable.py
===================================================================
--- megrok.rdb/trunk/src/megrok/rdb/tests/explicittable.py	                        (rev 0)
+++ megrok.rdb/trunk/src/megrok/rdb/tests/explicittable.py	2009-07-21 11:51:43 UTC (rev 102053)
@@ -0,0 +1,54 @@
+"""
+It's possible to directly specify a table using ``rdb.table`` as well.
+
+Let's first grok things::
+
+  >>> from grok.testing import grok
+  >>> grok('megrok.rdb.meta')
+  >>> grok(__name__)
+
+We need to set up an engine::
+
+  >>> from megrok.rdb.testing import configureEngine
+  >>> engine = configureEngine()
+  
+We now need to create the tables we defined in our database::
+
+  >>> rdb.setupDatabase(metadata)
+
+Let's start using the database now::
+
+  >>> session = rdb.Session()
+  >>> dummy = User(name=u'dummy', password=u'secret', role=u'admin')
+  >>> session.add(dummy)
+  >>> silly = User(name=u'silly', password=u'secret', role=u'admin')
+  >>> session.add(silly)
+
+We can now verify that the users are there::
+
+  >>> [(user.id, user.name, user.password, user.role) for user in
+  ... session.query(User)]
+  [(1, u'dummy', u'secret', u'admin'), (2, u'silly', u'secret', u'admin')]
+    
+"""
+
+
+import grok
+from megrok import rdb
+
+from sqlalchemy import (Table, Column, MetaData, Integer, Unicode)
+
+metadata = rdb.MetaData()
+
+
+user_table = Table(
+    'user_table', metadata,
+    Column('id', Integer, primary_key=True),
+    Column('name', Unicode(20), nullable=False, index=True, unique=True),
+    Column('password', Unicode(100), nullable=False),
+    Column('role', Unicode(20), nullable=False, index=True),
+    )
+
+class User(rdb.Model):
+    rdb.metadata(metadata)
+    rdb.table(user_table)

Modified: megrok.rdb/trunk/src/megrok/rdb/tests/test_rdb.py
===================================================================
--- megrok.rdb/trunk/src/megrok/rdb/tests/test_rdb.py	2009-07-21 11:38:43 UTC (rev 102052)
+++ megrok.rdb/trunk/src/megrok/rdb/tests/test_rdb.py	2009-07-21 11:51:43 UTC (rev 102053)
@@ -47,6 +47,11 @@
         tearDown=zopeTearDown,
         optionflags=optionflags))
     suite.addTest(doctest.DocTestSuite(
+        'megrok.rdb.tests.explicittable',
+        setUp=zopeSetUp,
+        tearDown=zopeTearDown,
+        optionflags=optionflags))
+    suite.addTest(doctest.DocTestSuite(
         'megrok.rdb.tests.reflection',
         setUp=zopeSetUp,
         tearDown=zopeTearDown,



More information about the Checkins mailing list