hi Anton - if you can show me correct table designs, e.g. as simple CREATE TABLE statements, that definitely do the thing you need, I can show you how to map to it. So far it's not clear if you're looking for schema design via SQLAlchemy's API.
- mike On Sep 10, 2014, at 6:36 PM, Anton <anschat...@gmail.com> wrote: > Hi Mike, > > I have two models that I did not provide in the example: Entity and Group. > Every group can assign some customer attributes to an entity, this is > reflected in GroupEntityAttributes. > Let's say GroupEntityAttributes(group_id=1, entity_id=1, key="color", > value="red") would mean that Group 1 assigned a customer attribute "color" > with a value "red" to > the entity with id 1. So when I want to load an entity for a group I want to > load the entity object plus all the custom attributes assigned to the entity > but the group. > Also I need some mechanism mark an entity as loadable for the group, for this > I am using a record like > GroupEntityAttributes(group_id=1, entity_id=1, key="_has_connection", > value=Null), so key "_has_connection" has a special meaning. If it presents, > then the entity should be loaded for the group with all other custom > attributes, otherwise no. For this purpose I created a model GroupEntity. > > So this way GroupEntity.query.filter_by(group_id=1).all() will give a list > with all entities loadable fir the Group 1. Every item of the list will have > an association to Group object and Entity object, I want others property to > represent a list of customer attributes, that I would like to implement as > described here > (https://bitbucket.org/zzzeek/sqlalchemy/src/374173e89d4e21a75bfabd8a655d17c247b6f1fc/examples/vertical/dictlike.py?at=master). > For this I need to have a self referencing relationship to > GroupEntityAttributes, which appears to be self-referencing because two > models use the same table. > > SimpleModel is just a mixin that I use in every model I create to make sure > that they all have a unique id. > > Thanks, > Anton. > > > On Wednesday, September 10, 2014 3:00:39 PM UTC-7, Michael Bayer wrote: > > On Sep 10, 2014, at 5:11 PM, Anton <ansch...@gmail.com> wrote: > >> So I am trying to do the following: >> class SimpleModel(object): >> __table_args__ = {'extend_existing': True} >> >> id = db.Column(db.Integer, primary_key=True) >> >> class GroupEntityAttributes(SimpleModel, db.Model): >> __table_args__ = {'extend_existing': True} >> __tablename__ = 'group_entity' >> >> #Table Columns >> id = db.Column(db.Integer, primary_key=True) >> group_id = db.Column(db.Integer, db.ForeignKey('groups.id'), >> nullable=False) >> entity_id = db.Column(db.Integer, db.ForeignKey('entities.id'), >> nullable=False) >> key = db.Column(db.String) >> value = db.Column(db.Text) >> >> #Relationships >> entity = db.relationship('Entity', lazy='joined') >> group = db.relationship('Group') >> >> class GroupEntityAttributesPoly(GroupEntityAttributes): >> __mapper_args__ = {'polymorphic_on': GroupEntityAttributes.key} >> >> class GroupEntity(GroupEntityAttributesPoly): >> __mapper_args__ = {'polymorphic_identity': '_has_connection'} >> >> others = db.relationship( >> 'GroupEntityAttributes', >> primaryjoin=and_( >> remote(foreign(GroupEntityAttributes.group_id)) == >> GroupEntityAttributes.group_id, >> remote(foreign(GroupEntityAttributes.entity_id)) == >> GroupEntityAttributes.entity_id, >> ) >> ) >> >> > > What's illustrated here doesn't really make sense. If > GroupEntityAttributes.group_id referred to "groups.id", then a relationship > extending from GroupEntity would need to refer to whatever class is mapped to > the "entities" table, which I don't see here. It looks like you're taking > foreign key columns on the "group_entity" table and somehow pointing it to > itself in that primaryjoin which doesn't make sense. GroupEntity would need > to be mapped to either "entities" or "groups" in order to refer to > GroupEntityAttributes using that pattern and this sort of looks like the > association object pattern, see > http://docs.sqlalchemy.org/en/rel_0_9/orm/relationships.html#association-object > for an example of what that looks like. > > Other things that you probably don't want: > > 1. polymorphic_on on a subclass, that should always go on the mapped class at > the bottom of the hierarchy, see > http://docs.sqlalchemy.org/en/rel_0_9/orm/inheritance.html#joined-table-inheritance > for basic examples > > 2. extend_existing, this is usually only relevant when you're using > reflection, otherwise it probably means you're setting things up incorrectly > > > > > > > > > > >> When I try to load the model GroupEntity I get an error: >> ArgumentError: Can't determine relationship direction for relationship >> 'GroupEntity.others' - foreign key columns within the join condition are >> present in both the parent and the child's mapped tables. Ensure that only >> those columns referring to a parent column are marked as foreign, either via >> the foreign() annotation or via the foreign_keys argument. >> >> I am not sure how to overcome this error. Would appreciate any help. >> >> Best, >> Anton. >> >> On Tuesday, September 9, 2014 1:10:40 PM UTC-7, Anton wrote: >> Trying to use with multiple table mapping. >> >> On Tuesday, September 9, 2014 1:03:25 PM UTC-7, Anton wrote: >> Hi, >> >> I need some help choosing the right pattern for the models I have. I have >> the following tables: >> Entity (INT id, VARCHAR name) >> Group (INT id, VARCHAT name) >> GroupEntityAttributes(INT entity_id, INT group_id, VARCHAR key, VARCHAR name) >> >> Entity and Group models are pretty straight forward. But >> GroupEntityAttributes represents Entity within some group with custom >> attributes added, so it resembles this pattern ( >> https://bitbucket.org/zzzeek/sqlalchemy/src/374173e89d4e21a75bfabd8a655d17c247b6f1fc/examples/vertical/dictlike.py?at=master >> ), the only difference is that there is an additional foreign key. >> I wonder if there is any approach I can use to adapt vertical pattern for my >> needs without modifying tables. >> >> Best, >> Anton. >> >> >> >> -- >> You received this message because you are subscribed to the Google Groups >> "sqlalchemy" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to sqlalchemy+...@googlegroups.com. >> To post to this group, send email to sqlal...@googlegroups.com. >> Visit this group at http://groups.google.com/group/sqlalchemy. >> For more options, visit https://groups.google.com/d/optout. > > > -- > You received this message because you are subscribed to the Google Groups > "sqlalchemy" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to sqlalchemy+unsubscr...@googlegroups.com. > To post to this group, send email to sqlalchemy@googlegroups.com. > Visit this group at http://groups.google.com/group/sqlalchemy. > For more options, visit https://groups.google.com/d/optout. -- You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To unsubscribe from this group and stop receiving emails from it, send an email to sqlalchemy+unsubscr...@googlegroups.com. To post to this group, send email to sqlalchemy@googlegroups.com. Visit this group at http://groups.google.com/group/sqlalchemy. For more options, visit https://groups.google.com/d/optout.