This whole thing is driving me crazy, What I want:
class Extra(Base):
__tablename__ = "extra"
# Primary key consists of two different columns !!!
tableId = Column(Integer,
primary_key=true)
tablename = Column(Unicode(20),
primary_key=True)
info = Column(........) #Not
relevant
class ex1(Base):
Id = Column(Integer, primary_key=True)
discriminator = Column(Unicode(20))
@declared_attr
def __tablename__(self):
return self.__name__.lower()
@declared_attr
def __mapper_args__(self):
if self.__name__ == 'ext1':
return {'polymorphic_on': self.discriminator,
'polymorphic_identity':unicode(self.__name__.lower()),
'extension': FilePropertiesMapperExtension(),
'batch' : False}
else:
return {'polymorphic_identity':unicode(self.__name__.lower()),
'inherit_condition': self.Id == extra.Id,
#needed for something else in this config (multiple
self reference)
'extension': FilePropertiesMapperExtension(),
#Needed for something else, not relevant for this sample
'batch' : False}
# ,, ,,
,, ,,
# Set up foreignkey and relation to Extra....
__table_args__ = (ForeignKeyConstraint(['discriminator', 'Id'],
['extra.Table','extra.TableId']),{})
extras = relation('Extra', cascade="all", lazy="dynamic"
backref="owner")
....
....
class ext2(ext1):
Id = Column(Integer,ForeignKey('ext1.Id'),
primary_key=True)
......
class ext3(ext1):
Id = Column(Integer,ForeignKey('ext1.Id'),
primary_key=True)
.....
Now I want:
Ext2 = ext2()
Extra_info = extra()
Ext2.extras.append(Extra_Info)
Ext2.discriminator should be "ext2"
Ext2.Id should be 1 for the first record
Extra_Info should be created in the database, with its columns : id set to the
Ext2.id and tablename to Ext.discriminator ......
Extra_Info.owner would point to Ext2
If Ext2 is deleted, all related extrainfo record would be delete too
if one Extra_Info is deleted, Extra_Info.owner should stay in place as well as
all other related
Extra is many to one polymorhic version of ext1
I hope this clarifies more what I want....
I really need the @declared_attr way of doing stuff and that is not related to
this question but might influence this question so I left it in......
Martijn
On Feb 10, 2011, at 18:13 , Michael Bayer wrote:
>
> On Feb 10, 2011, at 4:20 AM, Martijn Moeling wrote:
>
>> Another small thing:
>>
>> I took a look at:
>>
>> ForeignKeyConstraint(['invoice_id', 'ref_num'], ['invoice.invoice_id',
>> 'invoice.ref_num'])
>>
>> Now for Polymorphic tables:
>>
>>
>> in baseclass:
>>
>> baseclass.discriminator happens to be the __tablename__ of the polymorphic
>>
>> ForeignKeyConstraint('['baseclass.disciminator', baseclass.Id'],
>> ['someotherclass.tablename','someotherclass.tableId']
>> relationship('someotherclass', backref=baseclass, cascade="all",
>> lazy="dynamic")
>>
>>
>> in someotheclass:
>>
>> tablename = column(Unicode(20), primary_key=True)
>> tableId = column(Integer, primary_key=True)
>>
>> seems Ok to me.
>>
>> Now I need to make someotherclass work with non-polymorphic tables too!!
>>
>> anotherclass:
>> Id = column(Integer, primary_key=True)
>>
>> ForeignKeyConstaint('[anotherclass.__tablename__,'anotherclass.Id'],['someotherclass.tablename','someotherclass.tableId'])
>> relation('someotherclass', backref=baseclass, cascade="all",
>> lazy="dynamic")
>>
>> Is there any way to get this working without configuring it as polymorphic
>> an do no Inhiritance, I do not want each anotherclass record to have a
>> column discriminator with its own tablename!
>>
>> or can I use anotherclass.__tablename__ in the ForeignKeyConstaint?
>>
>> This has to do with the someotherclass being the "ACL" I talked about in a
>> previous post if that gives extra info. I am trying to implement the
>> MapperExtension.before_append where I need to refer to the "ACL" records in
>> a way like:
>>
>> for A in instance.ACL:
>> .....
>
> yeah, sorry, this use case continues to be 98% opaque to me. I don't
> understand what you mean by "make someotherclass work with non-polymorphic
> tables", a class is mapped in just one way, either with or without a
> discriminator column. A single class can't be mapped in both ways. If
> there's no discriminator, there's just one class that can be used for
> returned rows.
>
> If you could create a small test that illustrates a mapping and an expected
> result, perhaps I can attempt to find a way to get the ORM behavior you're
> looking for.
>
> Your mapper extension would continue to be used normally with a "dynamic"
> relationship since it uses query(cls) just like a regular query.
>
>
>
> --
> 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.