One more thing
Extra should also be related to other classes, not only ones setup "polymorphic"
Like:
class dummy(Base):
ID = Column (Integer,Primary_key=True)
# Set up foreignkey and relation to Extra....
__table_args__ = (ForeignKeyConstraint([<<<<<This tables
tablename>>>>, 'Id'], ['extra.Table','extra.TableId']),{})
#
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
extras = relation('Extra', cascade="all", lazy="dynamic"
backref="owner")
I do not really want to add a discriminator to the "Dummy" table for this
relation to work
This to explain:
>> 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.
Martijn
On Feb 12, 2011, at 15:57 , Martijn Moeling wrote:
> 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.
>
--
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.