sqlalchemy 通过变量声明加入负载
slqlachemy joined load by variable declaration
假设我有两个模型。帐户和问题。
class Account(DeclarativeBase):
__tablename__ = 'accounts'
id = Column(Integer, primary_key=True)
user_name = Column(Unicode(255), unique=True, nullable=False)
我的问题模型如下:
class Question(DeclarativeBase):
__tablename__ = 'questions'
id = Column(Integer, primary_key=True)
content = Column(Unicode(2500), nullable=False)
account_id = Column(Integer, ForeignKey(
'accounts.id', onupdate='CASCADE', ondelete='CASCADE'), nullable=False)
account = relationship('Account', backref=backref('questions'))
我得到了一种方法,可以从提供的问题 ID returns json 格式的问题。
像下面这样的方法时,只有问题的returnsid
content
account_id
@expose('json')
def question(self, question_id):
return dict(questions=DBSession.query(Question).filter(Question.id == question_id).one())
但我也需要将帐户的 user_name 包含在 json 响应中。奇怪的是(至少对我来说)我必须明确地告诉方法查询结果包含与帐户的关系,这样帐户信息将包含在 json 响应中:我的意思是做类似的事情这个
@expose('json')
def question(self, question_id):
result = DBSession.query(Question).filter(Question.id == question_id).one()
weird_variable = result.account.user_name
return dict(question=result)
为什么我要做这样的事情?这背后的原因是什么?
来自Relationship Loading Techniques:
By default, all inter-object relationships are lazy loading.
换句话说,在其默认配置中,当您获取 Question
时,关系 account 实际上不会加载帐户数据,但是当您访问 [=12] =] Question
实例的属性。这种行为是可以控制的:
from sqlalchemy.orm import joinedload
DBSession.query(Question).\
filter(Question.id == question_id).\
options(joinedload('account')).\
one()
添加 joinedload
选项指示查询使用连接同时加载与父项的关系。其他预加载技术也可用,它们可能的用例和权衡在 "What Kind of Loading to Use?"
下讨论
假设我有两个模型。帐户和问题。
class Account(DeclarativeBase):
__tablename__ = 'accounts'
id = Column(Integer, primary_key=True)
user_name = Column(Unicode(255), unique=True, nullable=False)
我的问题模型如下:
class Question(DeclarativeBase):
__tablename__ = 'questions'
id = Column(Integer, primary_key=True)
content = Column(Unicode(2500), nullable=False)
account_id = Column(Integer, ForeignKey(
'accounts.id', onupdate='CASCADE', ondelete='CASCADE'), nullable=False)
account = relationship('Account', backref=backref('questions'))
我得到了一种方法,可以从提供的问题 ID returns json 格式的问题。
像下面这样的方法时,只有问题的returnsid
content
account_id
@expose('json')
def question(self, question_id):
return dict(questions=DBSession.query(Question).filter(Question.id == question_id).one())
但我也需要将帐户的 user_name 包含在 json 响应中。奇怪的是(至少对我来说)我必须明确地告诉方法查询结果包含与帐户的关系,这样帐户信息将包含在 json 响应中:我的意思是做类似的事情这个
@expose('json')
def question(self, question_id):
result = DBSession.query(Question).filter(Question.id == question_id).one()
weird_variable = result.account.user_name
return dict(question=result)
为什么我要做这样的事情?这背后的原因是什么?
来自Relationship Loading Techniques:
By default, all inter-object relationships are lazy loading.
换句话说,在其默认配置中,当您获取 Question
时,关系 account 实际上不会加载帐户数据,但是当您访问 [=12] =] Question
实例的属性。这种行为是可以控制的:
from sqlalchemy.orm import joinedload
DBSession.query(Question).\
filter(Question.id == question_id).\
options(joinedload('account')).\
one()
添加 joinedload
选项指示查询使用连接同时加载与父项的关系。其他预加载技术也可用,它们可能的用例和权衡在 "What Kind of Loading to Use?"