我正在使用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)]
实际上非常慢:(
答案 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(作者姓名) - 代码不正确,修复它。