[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