I already have models for group, entity and group_entity. Now I am trying 
to build a model that would represent an entity for a group with all the 
custom attributes.

On Wednesday, September 10, 2014 5:06:36 PM UTC-7, Anton wrote:
>
> Mike, the tables are already there, I am trying to create models mapped on 
> the tables so it is easier to work with.
> Tables design looks like:
>
> CREATE TABLE group (
>     id integer NOT NULL,
>     name character varying
> );
>
>
> CREATE TABLE entity (
>     id integer NOT NULL,
>     name character varying
> );
>
> CREATE TABLE group_entity (
>     id integer NOT NULL,
>     entity_id integer,
>     key character varying,
>     value text,
>     group_id integer NOT NULL
> );
>
> Best,
> Anton.
>
>
>
>
>
> On Wednesday, September 10, 2014 4:51:54 PM UTC-7, Michael Bayer wrote:
>>
>> 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 <ansch...@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+...@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.

Reply via email to