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.

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.

Reply via email to