On Apr 24, 2012, at 7:18 PM, David Bowser <[email protected]> wrote:

> 
> On Apr 24, 2012, at 6:14 PM, Michael Bayer <[email protected]> wrote:
> 
>> 
>> On Apr 24, 2012, at 5:59 PM, David Bowser wrote:
>> 
>>> 
>>> On Apr 24, 2012, at 5:50 PM, Michael Bayer <[email protected]> wrote:
>>> 
>>>> one-to-many is defined as parent->child where child has a foreign key 
>>>> column referring to parent; many-to-one is the reverse, where parent has a 
>>>> foreign key that refers to child.  When you tell the ORM "foreign_keys = 
>>>> [some_col_on_parent]", that tells SQLA that the parent refers to the 
>>>> child, hence many-to-one, hence uselist is set to False.
>>> 
>>> 
>>> My apologies for not being precise.
>>> 
>>> I stated in the original message that the warning is occurring when using 
>>> the backref. So it defines many entries -> one profile fine, but when I 
>>> used the backref it still had uselist set to False.
>> 
>> UserMixin.user_id -> JournalEntry.id , foreign key is established as 
>> JournalEntry.id via the "foreign_keys" argument which propagates by default 
>> to the backref, so UserMixin.user_profile evaluates as one-to-many, hence 
>> uselist=True, JournalEntry.journal_entries evaluates as many-to-one, hence 
>> uselist=False.
>> 
>> If you enable INFO logging for the "sqlalchemy.orm" logger, it will output 
>> the "direction" that it picks up on for all relationships.
> 
> Look at that again:
> 
>    @_declared_attr
>    def user_profile(cls):
>        return orm.relationship('UserProfile',primaryjoin="%s.user_id == 
> UserProfile.id"%cls.__name__,
>                foreign_keys=lambda:[metadata.tables['user_profiles'].c.id],
>                backref=cls.__tablename__ if cls.__tablename__ else 
> tablename(cls.__name__))
> 
> UserMixin.user_id -> UserProfile.id
> 
> The foreign_key is set as UserProfile.id, which should make 
> JournalEntry.user_profile evaluate as one-to-many as per your statement 
> above. UserProfile.journal_entries should be many-to-one.
> 
> That is exactly what happens....
> 
> Relevant Log Lines with that code:
> 
> 19:07:35,441 INFO  [sqlalchemy.orm.mapper.Mapper] 
> (JournalEntry|journal_entries) initialize prop user_profile
> 19:07:35,441 INFO  [sqlalchemy.orm.properties.RelationshipProperty] 
> JournalEntry.user_profile setup primary join journal_entries.user_id = 
> user_profiles.id
> 19:07:35,442 INFO  [sqlalchemy.orm.mapper.Mapper] (UserProfile|user_profiles) 
> _configure_property(journal_entries, RelationshipProperty)
> 19:07:35,442 INFO  [sqlalchemy.orm.properties.RelationshipProperty] 
> JournalEntry.user_profile local/remote pairs [(journal_entries.user_id / 
> user_profiles.id)]
> 19:07:35,442 INFO  [sqlalchemy.orm.properties.RelationshipProperty] 
> JournalEntry.user_profile relationship direction <symbol 'ONETOMANY>
> 19:07:35,442 INFO  [sqlalchemy.orm.properties.RelationshipProperty] 
> JournalEntry.user_profile secondary synchronize pairs []
> 19:07:35,442 INFO  [sqlalchemy.orm.properties.RelationshipProperty] 
> JournalEntry.user_profile setup secondary join None
> 19:07:35,442 INFO  [sqlalchemy.orm.properties.RelationshipProperty] 
> JournalEntry.user_profile synchronize pairs [(journal_entries.user_id => 
> user_profiles.id)]
> 19:07:35,442 INFO  [sqlalchemy.orm.properties.RelationshipProperty] 
> UserProfile.journal_entries setup primary join journal_entries.user_id = 
> user_profiles.id
> 19:07:35,442 INFO  [sqlalchemy.orm.properties.RelationshipProperty] 
> UserProfile.journal_entries setup secondary join None
> 19:07:35,443 INFO  [sqlalchemy.orm.properties.RelationshipProperty] 
> UserProfile.journal_entries local/remote pairs [(user_profiles.id / 
> journal_entries.user_id)]
> 19:07:35,443 INFO  [sqlalchemy.orm.properties.RelationshipProperty] 
> UserProfile.journal_entries relationship direction <symbol 'MANYTOONE>
> 19:07:35,443 INFO  [sqlalchemy.orm.properties.RelationshipProperty] 
> UserProfile.journal_entries secondary synchronize pairs []
> 19:07:35,443 INFO  [sqlalchemy.orm.properties.RelationshipProperty] 
> UserProfile.journal_entries synchronize pairs [(journal_entries.user_id => 
> user_profiles.id)]
> 
> and yet I still get:
> 
> >>> profile.journal_entries
> /Users/Me/Documents/Work/Projects/myProject/myProject/lib/python2.7/site-packages/SQLAlchemy-0.7.6-py2.7-macosx-10.7-intel.egg/sqlalchemy/orm/strategies.py:508:
>  SAWarning: Multiple rows returned with uselist=False for lazily-loaded 
> attribute 'UserProfile.journal_entries' 
> <myProject.model.user_data.JournalEntry object at 0x10ba21210>
> 
> Which leaves me really confused...
> 
> ~Dave

Never mind, That log show it forming as a one to many the wrong way. I confused 
between that and the updated version that worked, when I flipping back and 
forth in my version control.

However the one-to-many foreignkey matches your explaination.

It's not a pressing issue, and I can let it drop since I have working solution 
anyways, it just seems off.

~Dave

-- 
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.

Reply via email to