【问题标题】:Optimise SQL Alchemy request with relationship使用关系优化 SQL Alchemy 请求
【发布时间】:2015-07-11 06:00:05
【问题描述】:

我正在将 Flask 和 SQL Alchemy 用于 Web 应用程序。

我有一个像这样的多对多关系:

from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class Link(Base):
    __tablename__ = 'link'
    id = Column(Integer, primary_key=True)
    name = Column(String(64))
    url = Column(String(128))

class Category(Base):
    __tablename__ = 'category'
    id = Column(Integer, primary_key=True)
    name = Column(String(64))
    links = relationship("Link",
                         secondary=Table('association', Base.metadata,
                                         Column('category_id', Integer, ForeignKey('category.id')),
                                         Column('link_id', Integer, ForeignKey('link.id'))),
                         backref="categories")

所以我得到了linkscategories

当请求链接以显示它们及其类别时,我正在这样做:

links = Link.query.all()
for link in links:
    print link.name
    for categorie in link.categories
        print categorie.name

它工作正常,但问题是,对于每个link.categories 调用,都会执行一次 SQL 查询。因此,如果我有 10 个链接,将完成 11 个查询(1 个用于获取链接,每个链接一个用于获取类别)。

难道不能用 Flask 在一个查询中执行吗? (使用JOIN) (我不想写SQL查询,我想用ORM)

【问题讨论】:

    标签: python flask sqlalchemy


    【解决方案1】:

    我自己找到了答案。 查询模型时,我只需要像这样添加选项joinedload('categories')

    links = Link.query.options(joinedload('categories')).all()
    for link in links:
        print link.name
        for categorie in link.categories
            print categorie.name
    

    现在,只执行一个 SQL 查询。

    【讨论】:

    • 您还可以使用lazy='joined'lazy='subquery' 在关系中配置该选项
    猜你喜欢
    • 2015-08-02
    • 2013-10-02
    • 2013-03-13
    • 1970-01-01
    • 1970-01-01
    • 2013-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多