Oll*_*ass 10 python orm sqlalchemy relationship
是否可以使用ids而不是对象添加到SQLAlchemy关系?
例如,考虑两个声明性SQLAlchemy类,Review和Artist,它们之间有关系:
class Review(Base):
artist_id = Column(Integer, ForeignKey('artist.id'))
artist = relationship(Artist, backref=backref('reviews', order_by=id))
# etc.
class Artist(Base):
# etc.
Run Code Online (Sandbox Code Playgroud)
有了要添加到艺术家的评论ID列表,我似乎需要从id中查找艺术家,然后将艺术家对象添加到评论中,如下所示:
for review_id in review_ids:
review = session.query(Review).filter(Review.id==review_id).first()
artist.reviews.append(review)
Run Code Online (Sandbox Code Playgroud)
我确信跳过查找并添加id会更有效,但这可能吗?
你最好的选择可能是update在后备表上组成一个表达式.否则,你Review实际上不能在没有实际查询的情况下修改它(这就是你正在做的事情;你根本就没有修改它Artist).
假设Review.id是主键,那大致是:
conn = session.connection()
conn.execute(Review.__table__
.update()
.values(artist_id=artist_id)
.where(Review.id.in_(review_ids))
)
Run Code Online (Sandbox Code Playgroud)
我认为,如果您要坚持使用纯粹的ORM解决方案,则必须忍受效率低下的查询模式。
@TokenMacGuy提供了一个很好的选择。您可以通过添加add_reviews()到Artist()类中来集成该方法。这将增加“标准” orm api,因此您可以根据情况使用其中一种。
from sqlalchemy.orm.session import object_session
class Artist(Base):
def add_reviews(self, review_ids):
sess = object_session(self)
if isinstance(review_ids, int): review_ids = [review_ids]
sess.execute(
Review.__table__
.update()
.values(artist_id=self.artist_id)
.where(Review.id.in_(review_ids))
)
sess.refresh(self)
review_ids = [123, 556, 998, 667, 111]
artist.add_reviews(review_ids)
review_id = 333
artist.add_reviews(review_id)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3010 次 |
| 最近记录: |