假设我有这样的一对多关系:
class Book(Base):
__tablename__ = "books"
id = Column(Integer)
...
library_id = Column(Integer, ForeignKey("libraries.id"))
class Library(Base):
__tablename__ = "books"
id = Column(Integer)
...
books = relationship(Book, backref="library")
现在,如果我有一本书的 ID,有没有办法从Library.books
关系中检索它,“在这个特定的图书馆给我一本 id=10 的书”?就像是:
try:
the_book = some_library.books.by_primary_key(10)
except SomeException:
print "The book with id 10 is not found in this particular library"
我能想到的解决方法(但我宁愿避免使用):
book = session.query(Book).get(10)
if book and book.library_id != library_id:
raise SomeException("The book with id 10 is not found in this particular library")
或者
book = session.query(Book).filter(Book.id==10).filter(Book.library_id=library.id).one()
原因:想象有几种不同的关系(scifi_books
等books_on_loan
)指定不同的主要连接条件——手动查询需要为所有这些条件编写单独的查询,而 SQLAlchemy已经知道如何检索该关系的项目。此外,我更愿意一次加载所有书籍(通过访问 library.books)而不是发出单独的查询。
另一种可行但效率低下且不优雅的选择是:
for b in library.books:
if b.id == book_id:
return b
我目前使用的是:
library_books = {b.id:b for b in library.books}
for data in list_of_dicts_containing_book_id:
if data['id'] in library_books:
library_books[data['id']].do_something(data)
else:
print "Book %s is not in the library" % data['id']
我只是希望有一种更好的内置方法可以通过他们的 id 从关系中快速检索项目
UPD:我在sqlalchemy 邮件列表中提出了这个问题。