假设我有以下内容(在Python 3和SQLAlchemy中):
class Book(Base):
id = Column(Integer, primary_key=True)
chapters = relationship("Chapter", backref="book")
class Chapter(Base):
id = Column(Integer, primary_key=True)
name = Column(String)
book_id = Column(Integer, ForeignKey(Book.id))
def check_for_chapter(book):
# This is where I want to check to see if the book has a specific chapter.
for chapter in book.chapters:
if chapter.name == "57th Arabian Tale"
return chapter
return None
这感觉就像是一种“非惯用”的方法,因为它似乎不太可能利用数据库来搜索给定的章节。在最坏的情况下,似乎n
对数据库的调用将用于检查章节标题,尽管我对SQLAlchemy的有限理解表明这可以配置。我不知道的是,是否有办法直接针对您已经获取的对象的关系启动查询?如果是这样,那怎么做呢?
答案 0 :(得分:1)
如果您想获得特定书籍的特定章节,下面的代码应该在一个SQL语句中执行:
book = ... # get book instance
chapter = (
session.query(Chapter)
.with_parent(book)
.filter(Chapter.name == "57th Arabian Tale")
.one()
)
例如,如果您只有书名和章节标题,则可以这样做:
chapter = (
session.query(Chapter)
.join(Book)
.filter(Book.name == "One Thousand and One Nights")
.filter(Chapter.name == "57th Arabian Tale")
.one()
)
同时阅读Querying with Joins以及SQLAlchemy Documentation的其余部分。