sqlachemy:使用连接优化查询

时间:2016-11-03 23:28:07

标签: python mysql sqlalchemy

我正在使用sqlachemy和MySQL后端。实际上在优化查询时遇到了问题。

我有以下一组模型:

class Book(Base):
    __tablename__ = 'books'
    name = Column(String(32), primary_key=True)
    sku = Column(Integer, nullable=False)



class Author(Base):
    __tablename__ = 'authors'
    name = Column(String(64), primary_key=True)
    # book
    books = relationship(Book, secondary=Table(
        'author_books', Base.metadata,
        Column('author', String(32),
               ForeignKey(Author.name), primary_key=True),
        Column('book', String(64), ForeignKey("book.title"),
               primary_key=True)
    ), backref=backref('book_authors', cascade="save-update"))

正在进行查询:

authors_with_books = [(autor.name, [book.name for book in books]) for author in session.query(Authors)]

实际上非常慢:(

2 个答案:

答案 0 :(得分:0)

您的查询很慢,因为您正在加入python上的数据。

在数据库上做。

尝试类似的事情:

authors_with_books = session.query(Author.name, Book.name)

它将在SQL上创建一个连接

答案 1 :(得分:0)

authors_with_books = session.query(作者).join(作者书)

使用' lazyload' PARAM。

尝试在模型中重写many_to_many表。这对我有用:

class Author(Base):
    __tablename__ = 'authors'
    name = Column(String(64), primary_key=True)
    books = relationship('Book', secondary='author_books')


author_book = Table(
    'author_books', Base.metadata,
    Column('author', String(32), ForeignKey("author.name", match=u'FULL'), primary_key=True),
    Column('book', String(64), ForeignKey("book.title", match=u'FULL'), primary_key=True)
)

我认为ForeignKey(作者姓名) - 代码不正确,修复它。