如何在会话SQLAlchemy中获取对象的权限

时间:2018-08-02 17:18:55

标签: python sqlite flask orm sqlalchemy

我有两个表:

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)

但这是一个不好的方法。

1 个答案:

答案 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