2017-11-07 13 views
6

tôi có các mô hình SQLAlchemy sau:Tránh chọn sau khi tuôn ra khi giao đến mối quan hệ con

class Parent(Base): 
    id = Column(Integer, primary_key=True) 

class Child(Base): 
    id = Column(Integer, primary_key=True) 
    title = Column(String, nullable=False) 
    parent_id = Column(Integer, ForeignKey(Parent.id), nullable=False) 

    parent = relationship(Parent, 
          backref=backref('children', 
              order_by=id, 
              cascade='all, delete-orphan')) 

Và sau đó tôi muốn tạo ra một phụ huynh và một số trẻ em, tất cả trong cùng một tuyên bố:

p = Parent() 
DBSession.add(p) 

# some unrelated code runs which triggers a flush 

p.children = [Child(title=title) for title in titles] 

Câu lệnh gán p.children = này kích hoạt tuyên bố SELECT không mong muốn, vì SQLAlchemy phải xóa mọi đối tượng có sẵn Child đã tồn tại trước đó trỏ đến Parent. Tôi nhận ra rằng tôi có thể loại bỏ câu lệnh SELECT với tùy chọn lazy='noload' trên backref, nhưng tôi cần mối quan hệ này hoạt động bình thường (tức là lấy kết quả từ DB) trong các ngữ cảnh khác.

Có cách nào tôi có thể tạo thuộc tính trả về giá trị của mối quan hệ noload, nếu nó đã được thiết lập và sử dụng mối quan hệ thường xuyên để tải kết quả từ DB? Hay tôi thậm chí còn nghĩ về điều này đúng không?

+1

Bạn có thể tắt tự động hết hạn trên phiên của mình không? Điều đó có giải quyết được điều này không? –

+0

Có! Đặt 'DBSession.no_autoflush' loại bỏ câu lệnh' SELECT' không mong muốn. Tôi sẽ viết nó lên. – shroud

Trả lời

2

Sam trong các ý kiến ​​chỉ tôi đến câu trả lời đúng, DBSession.no_autoflush:

with DBSession.no_autoflush: 
    p = Parent() 
    DBSession.add(p) 

    # some unrelated code runs which triggers a flush 

    p.children = [Child(title=title) for title in titles] 

này giúp loại bỏ các SELECT tuyên bố không mong muốn khi giao đến p.children.

+0

Điều này có khiến cho các trẻ em cũ còn nguyên vẹn trong DB, bây giờ SQLA sẽ không thực hiện lựa chọn, hoặc là việc xóa chỉ bị trì hoãn? –

+0

Bởi vì tôi vừa tạo ra đối tượng, tôi biết nó chưa có con. – shroud

+0

Phải, đã bỏ lỡ chút thông tin nhỏ trong bài đăng. Nên đọc với suy nghĩ. –

Các vấn đề liên quan