On Feb 12, 2011, at 2:15 AM, cd34 wrote:

> I'm trying to pass a value to a relation at runtime rather than
> instantiation time.  I've got the callable working with a fixed value,
> but, in reading the docs over the last few days , I'm either not
> finding the proper incantation or the right terms in the documentation
> to figure out what I'm trying to do.
> 
> The barest example code I can write that demonstrates what I'm trying
> to do:
> 
> #!/usr/bin/python2.6
> 
> import sqlalchemy
> 
> from sqlalchemy import create_engine
> from sqlalchemy import Column
> from sqlalchemy import Unicode
> from sqlalchemy import ForeignKey
> from sqlalchemy import and_
> 
> from sqlalchemy.orm import relationship
> from sqlalchemy.orm import mapper
> from sqlalchemy.orm import sessionmaker
> from sqlalchemy.orm import backref
> 
> from sqlalchemy.ext.declarative import declarative_base
> Base = declarative_base()
> 
> engine = create_engine('sqlite:///:memory:', echo=True)
> metadata = Base.metadata
> 
> class AuthUser(Base):
>    __tablename__ = 'auth_users'
> 
>    id = Column(sqlalchemy.Integer(unsigned=True), primary_key=True,
>                autoincrement=True)
> 
> class NewsVoteLog(Base):
>    __tablename__ = 'news_vote_log'
> 
>    id = Column(sqlalchemy.Integer(unsigned=True), primary_key=True,
>                autoincrement=True)
>    user_id = Column(sqlalchemy.Integer(unsigned=True),
>                     ForeignKey(AuthUser.id))
>    ncid = Column(sqlalchemy.Integer( unsigned=True),
>                  ForeignKey('news_comments.id'))
> 
>    def __repr__(self):
>        return 'NewsVoteLog <id: %s user_id: %s ncid: %s>' %
> (self.id,
>                self.user_id, self.ncid)
> 
> def callable_user_id():
>    return 1
> 
> class NewsComment(Base):
>    __tablename__ = 'news_comments'
> 
>    id = Column(sqlalchemy.Integer(unsigned=True), primary_key=True,
>                autoincrement=True)
>    parent_id = Column(sqlalchemy.Integer(unsigned=True),
>                       ForeignKey('news_comments.id'), default=0)
>    title = Column(Unicode(120))
> 
>    #votes = relationship('NewsVoteLog',
> backref=backref('news_vote_log'), remote_side=NewsVoteLog.ncid)
>    votes = relationship('NewsVoteLog',
> backref=backref('news_vote_log'),
>            primaryjoin=and_(NewsVoteLog.ncid==id,
>                             NewsVoteLog.user_id==callable_user_id),
>            foreign_keys=[NewsVoteLog.ncid, NewsVoteLog.user_id])
> 
> metadata.create_all(engine)
> 
> DBSession = sessionmaker(bind=engine)()
> 
> user = AuthUser()
> DBSession.add(user)
> user2 = AuthUser()
> DBSession.add(user2)
> user3 = AuthUser()
> DBSession.add(user3)
> 
> news = NewsComment(parent_id=0, title='test article')
> DBSession.add(news)
> 
> DBSession.flush()
> 
> vote1 = NewsVoteLog(user_id=user.id, ncid=news.id)
> DBSession.add(vote1)
> vote2 = NewsVoteLog(user_id=user2.id, ncid=news.id)
> DBSession.add(vote2)
> vote3 = NewsVoteLog(user_id=user3.id, ncid=news.id)
> DBSession.add(vote3)
> 
> 
> DBSession.flush()
> 
> #test_record =
> DBSession.query(NewsComment).filter(NewsComment.id==1).one()
> test_record =
> DBSession.query(NewsComment).filter(NewsComment.id==1).params(uid=1).one()
> print test_record.votes
> 
> 
> What I would like to do is pass uid at runtime.  I hacked it together
> with an outerjoin, but, as the child records are a relation from the
> parent, only the parent received the outerjoin.

What's making this hard to follow is that "uid" is only referenced in your 
Query below and I don't see any other mention of what "uid" is.

There's a recipe for the general idea of passing binds to relationship at 
http://www.sqlalchemy.org/trac/wiki/UsageRecipes/GlobalFilter .    The 
elaborate side of it is when the relationship is lazily loading, you have to 
store your bind parameter in the lazyloader itself, hence the TemporalLoader 
class in that recipe.




> 
> If someone can point me to the documentation or name the concept I'm
> looking for, I'd appreciate it.  Thanks.
> 
> -- 
> You received this message because you are subscribed to the Google Groups 
> "sqlalchemy" group.
> To post to this group, send email to sqlalchemy@googlegroups.com.
> To unsubscribe from this group, send email to 
> sqlalchemy+unsubscr...@googlegroups.com.
> For more options, visit this group at 
> http://groups.google.com/group/sqlalchemy?hl=en.
> 

-- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To post to this group, send email to sqlalchemy@googlegroups.com.
To unsubscribe from this group, send email to 
sqlalchemy+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en.

Reply via email to