我有两个表:
class Project(DataBase):
__tablename__ = 'projects'
id = Column(Integer, primary_key=True, autoincrement=True, nullable=False)
name = Column(String, nullable=False, unique=True)
domain = Column(String, nullable=False)
phrases = relationship("Phrase", backref='proj')
def __init__(self, name, domain):
self.name = name
self.domain = domain
class Phrase(DataBase):
__tablename__ = 'phrases'
query_id = Column(Integer, primary_key=True, autoincrement=True, nullable=False)
query_text = Column(String, nullable=False)
project = Column(Integer, ForeignKey('projects.id'), nullable=False)
enable = Column(Boolean, nullable=False, default=True)
def __init__(self, query_text, project, city):
self.query_text = query_text
self.project = project
我有一个功能:
def get_first_query():
session = Session(bind=engine)
q = session.query(Phrase).filter(Phrase.enable == True).first()
session.close()
return q
我想从表2中获取一个对象,而不是从第一个表中获取其对象:
session = Session(bind=engine)
q = get_first_query()
print(q.proj)
它不起作用并显示此错误:
sqlalchemy.orm.exc.DetachedInstanceError:父实例未绑定到Session;的延迟加载操作 属性“ proj”无法继续
我可以这样做:
session = Session(bind=engine)
q = get_first_query()
q_project = session.query(Project).filter(Project.id == q.project)
但这是一个不好的方法。
答案 0 :(得分:0)
您可以通过proj
属性来评估相关对象。
session.query(Phrase).filter(
Phrase.enable == True
).first().proj
这样,您将再打一次数据库才能获取它,因此您需要再次打开会话。为避免其他查询,您可以使用joined load:
session.query(Phrase).filter(
Phrase.enable == True
).options(
joinedload('proj')
).first().proj