On Jul 21, 2011, at 2:11 AM, Fayaz Yusuf Khan wrote: > Hi, > I have this declarative table model: > http://paste.pound-python.org/show/9857/
The short answer is you can't do it that way right now. The "user" and "timestamp" columns of C can't get assigned to the Table by declarative because they've already been instrumented by the mapping of the Timeline class - the columns generated on the TMixin class are replaced by the instrumented versions of Timeline. You'd have to forego the usage of mixins here or have C() use a mixin that isn't in the hierarchy of Timeline. Ticket #2226 is added to see if this can be fixed. > ========================================================== > from sqlalchemy import Column, String, ForeignKeyConstraint, Integer > from sqlalchemy.ext.declarative import declarative_base, declared_attr > > > class TableName(object): > @declared_attr > def __tablename__(cls): > return cls.__name__ > > > Base=declarative_base(cls=TableName) > > > class TMixin(object): > > @declared_attr > def user(cls): > return Column(String, primary_key=True) > > @declared_attr > def timestamp(cls): > return Column(Integer, autoincrement=False, primary_key=True) > > > class Timeline(TMixin, Base): > > snaptype = Column(Integer, primary_key=True, autoincrement=False) > > __mapper_args__ = {'polymorphic_on': snaptype} > > > class CMixin(TMixin): > > @declared_attr > def __table_args__(cls): > return (ForeignKeyConstraint( > ['user', 'timestamp'], > ['Timeline.user', 'Timeline.timestamp']),) > > @declared_attr > def __mapper_args__(cls): > return {'polymorphic_identity': CMixin.__subclasses__().index(cls)} > > > class C(CMixin, Timeline): > > pass > > ========================================================== > > But on running this code, I get: > ========================================================== > Traceback (most recent call last): > File "schema.py", line 45, in <module> > class C(CMixin, Timeline): > File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/ext/declarative.py", > line 1129, in __init__ > _as_declarative(cls, classname, cls.__dict__) > File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/ext/declarative.py", > line 1027, in _as_declarative > **table_kw) > File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/schema.py", line > 265, in __new__ > table._init(name, metadata, *args, **kw) > File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/schema.py", line > 340, in _init > self._init_items(*args) > File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/schema.py", line 64, > in _init_items > item._set_parent_with_dispatch(self) > File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/events.py", line > 227, in _set_parent_with_dispatch > self._set_parent(parent) > File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/schema.py", line > 2010, in _set_parent > col = table.c[col] > File "/usr/local/lib/python2.7/dist- > packages/sqlalchemy/util/_collections.py", line 88, in __getitem__ > return self._data[key] > KeyError: 'user' > ========================================================== > > I don't get any error if C isn't inheriting from Timeline (ie, no joint-table > inheritance). What could be wrong here? > > sqlalchemy.__version__ = '0.7.1' > > And thanks in advance. > > -- > Fayaz Yusuf Khan > Cloud developer and designer > Dexetra SS, Kochi, India > fayaz.yusuf.khan_AT_gmail_DOT_com > fayaz_AT_dexetra_DOT_com > +91-9746-830-823 > <schema.py> -- You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To post to this group, send email to sqlalchemy@googlegroups.com. To unsubscribe from this group, send email to sqlalchemy+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/sqlalchemy?hl=en.