优化 SQL 关系炼金请求
Optimise SQL Alchemy request with relationship
我在 Web 应用程序中使用 Flask 和 SQL Alchemy。
我有一个像这样的多对多关系:
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")
所以我得到了 links
和 categories
。
在请求 link 以显示它们及其类别时,我正在这样做:
links = Link.query.all()
for link in links:
print link.name
for categorie in link.categories
print categorie.name
它工作正常,但问题是,对于每个 link.categories
调用,都会执行一个 SQL 查询。因此,如果我得到 10 links,将完成 11 个查询(1 个用于获取 links,每个 link 一个用于获取类别)。
难道不能用 Flask 在一次查询中执行吗? (使用 JOIN
)
(我不想写SQL查询,我想用ORM)
我自己找到了答案。
查询模型时,我只需要像这样添加选项 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 查询。
我在 Web 应用程序中使用 Flask 和 SQL Alchemy。
我有一个像这样的多对多关系:
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")
所以我得到了 links
和 categories
。
在请求 link 以显示它们及其类别时,我正在这样做:
links = Link.query.all()
for link in links:
print link.name
for categorie in link.categories
print categorie.name
它工作正常,但问题是,对于每个 link.categories
调用,都会执行一个 SQL 查询。因此,如果我得到 10 links,将完成 11 个查询(1 个用于获取 links,每个 link 一个用于获取类别)。
难道不能用 Flask 在一次查询中执行吗? (使用 JOIN
)
(我不想写SQL查询,我想用ORM)
我自己找到了答案。
查询模型时,我只需要像这样添加选项 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 查询。