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.