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
 


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