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.
