On Nov 17, 2010, at 4:05 PM, J wrote:
> hmm... but i was thinking of having specialized methods for every
> table/object. am i missing something from your suggestion?
No, SqlSoup only offers the base class for all objects as an option. Here's a
patch you can try:
diff -r 67d8f4e2fcb9 lib/sqlalchemy/ext/sqlsoup.py
--- a/lib/sqlalchemy/ext/sqlsoup.py Wed Nov 17 10:55:10 2010 -0500
+++ b/lib/sqlalchemy/ext/sqlsoup.py Wed Nov 17 16:17:23 2010 -0500
@@ -540,7 +540,7 @@
j = join(*args, **kwargs)
return self.map(j)
- def entity(self, attr, schema=None):
+ def entity(self, attr, schema=None, base=None):
try:
t = self._cache[attr]
except KeyError, ke:
@@ -548,7 +548,7 @@
if not table.primary_key.columns:
raise PKNotFoundError('table %r does not have a primary key
defined [columns: %s]' % (attr, ','.join(table.c.keys())))
if table.columns:
- t = _class_for_table(self.session, self.engine, table,
self.base)
+ t = _class_for_table(self.session, self.engine, table, base or
self.base)
else:
t = None
self._cache[attr] = t
mysoup.entity('mytable', base=MyBaseClass)
> how would
> you have a base class that would somehow specialize depending on the
> child object?
>
> i went ahead and executed my mixin idea by attacking the db._cache
> dict with the mixins:
>
> def __bind_mixins(db):
> for table_name,v in db._cache.items():
> # this is pretty retarded, just truncates last letter assuming
> 's' plural
> mixin_name = table_name[:-1]
> try:
> # this is also pretty retarded. __import__() didn't quite
> work.
> # i'm thinking it was a circular import/runtime execution
> order issue
> exec 'from mixins.%s import %s' % (mixin_name, mixin_name)
> mixin_cls = locals()[mixin_name]
> db._cache[table_name].__bases__ += (mixin_cls,)
> except ImportError: pass
>
>
> On Nov 17, 8:02 am, Michael Bayer <[email protected]> wrote:
>> On Nov 17, 2010, at 4:23 AM, J wrote:
>>
>>
>>
>>> so i'm using sqlsoup to support a legacy db, and am thoroughly
>>> enjoying it. it was awesome setting up relationships and all that
>>> even though the underlying db schema didn't have any foreign key
>>> defines!
>>
>>> however, i'm at a point where i'd like to add some helper funcitons/
>>> methods to some MappedFoo objects that sqlsoup likes to return.
>>
>>> i was thinking of using a mixin to add the extra functionality. for
>>> example:
>>
>>> # assume foo is a MappedFoo instance returned from sqlsoup already
>>> class x:
>>> def bar(): print 'bar'
>>> foo.__bases__ += (x,)
>>> foo.bar() # prints 'bar' as expected
>>
>>> however, it would be super if there was some way to have the sqlsoup
>>> getters already have this mixin or some overriding baseclass
>>> configured... or some automated way of applying a mixin behind the
>>> scenes.
>>
>> SqlSoup allows a "base" argument which will serve as the base class for all
>> generated classes:
>>
>> SqlSoup(engine, base=MyClass)
>>
>> we should probably add the constructor and stuff to the docstrings.
>>
>>
>>
>>> thoughs? thanks.
>>
>>> --
>>> You received this message because you are subscribed to the Google Groups
>>> "sqlalchemy" group.
>>> To post to this group, send email to [email protected].
>>> To unsubscribe from this group, send email to
>>> [email protected].
>>> For more options, visit this group
>>> athttp://groups.google.com/group/sqlalchemy?hl=en.
>
> --
> You received this message because you are subscribed to the Google Groups
> "sqlalchemy" group.
> To post to this group, send email to [email protected].
> To unsubscribe from this group, send email to
> [email protected].
> For more options, visit this group at
> http://groups.google.com/group/sqlalchemy?hl=en.
>
--
You received this message because you are subscribed to the Google Groups
"sqlalchemy" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/sqlalchemy?hl=en.