【问题标题】:How to get parrent of object in session SQLAlchemy如何在会话 SQLAlchemy 中获取对象的父级
【发布时间】:2019-01-10 13:08:36
【问题描述】:

我有两张桌子:

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:父实例未绑定到会话;懒加载操作 属性“proj”无法继续

我可以这样做:

session = Session(bind=engine) 
q = get_first_query()
q_project = session.query(Project).filter(Project.id == q.project)

但这是一个糟糕的方法。

【问题讨论】:

标签: python sqlite flask orm sqlalchemy


【解决方案1】:

您可以通过proj属性评估相关对象。

session.query(Phrase).filter(
    Phrase.enable == True
).first().proj

这样,您将再次访问数据库以获取它,因此您需要再次打开会话。为避免额外查询,您可以使用joined load:

session.query(Phrase).filter(
    Phrase.enable == True
).options(
    joinedload('proj')
).first().proj

【讨论】:

    猜你喜欢
    • 2012-01-05
    • 1970-01-01
    • 2021-05-01
    • 2013-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多