gpt4 book ai didi

python - SQLAlchemy:如何通过对象的 PK 从关系中获取对象?

转载 作者:太空宇宙 更新时间:2023-11-04 10:53:26 25 4
gpt4 key购买 nike

假设我有一个这样的一对多关系:

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_booksbooks_on_loan 等)指定不同的 primaryjoin 条件 - 手动查询需要为所有这些条件编写单独的查询,而 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 mail list 中提出了这个问题.

最佳答案

SQLAlchemy 的查询对象有 with_parent 方法,它就是这样做的:

with_parent(instance, property=None)

Add filtering criterion that relates the given instance to a child object or collection, using its attribute state as well as an established relationship() configuration.

所以在我的示例中,代码看起来像

q = session.query(Book)
q = q.with_parent(my_library, "scifi_books")
q = q.filter(Book.id==10).one()

虽然 my_library.scifi_books 关系已经加载,但这将发出一个单独的查询。似乎没有“内置”方法可以通过 PK 从已加载的关系中检索项目,因此最简单的方法是将关系转换为字典并使用它来查找项目:

book_lookup = {b.id: b for b in my_library.scifi_books}
book = books_lookup[10]

关于python - SQLAlchemy:如何通过对象的 PK 从关系中获取对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12031861/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com