2011-04-30 2 views
17

Tôi có hai bảng, NewsFiles:SQLAlchemy phụ thuộc vòng tròn - làm thế nào để giải quyết nó?

# unrelated columns removed 
class News(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    file_id_logo = db.Column(db.Integer, db.ForeignKey('files.id')) 
    logo = db.relationship('File', lazy=False) 

class File(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    news_id = db.Column(db.Integer, db.ForeignKey('news.id')) 
    news = db.relationship('News', lazy=False, backref=db.backref('files')) 

Sau khi thêm file_id_logo fkey, SQLAlchemy nêu ra một CircularDependencyError. Tôi đã thử post_update=True trong mối quan hệ logo, nhưng nó không thay đổi bất cứ điều gì.

Cách thích hợp để giải quyết vấn đề này là gì?

Các trường hợp sau đây có thể xảy ra (trong trường hợp nó vấn đề):

  • một tệp không có hoặc đúng một Tin tức được giao.
  • Nếu Tệp không có Tin tức, cũng không có Tin tức nào có tệp này được tham chiếu làm biểu trưng của nó.
  • Có thể có nhiều Tệp cho một Tin tức, nhưng chỉ một trong các Tệp này có thể là logo.
  • Vì vậy, nếu một Tin tức có số logo, Tệp được tham chiếu cũng có tin này là news.

Trả lời

22

use_alter - được chuyển đến ForeignKeyConstraint cơ bản để cho biết ràng buộc phải được tạo/giảm bên ngoài từ câu lệnh CREATE TABLE/DROP TABLE. Xem hàm tạo của lớp đó để biết chi tiết.

http://docs.sqlalchemy.org/en/rel_0_8/core/schema.html?highlight=use_alter#foreign-key-api-constructs

+0

Đã làm việc tốt để loại bỏ lỗi, nhưng nó đã phá vỡ một số mối quan hệ khác. Vì vậy, tôi quyết định chỉ đơn giản là loại bỏ ForeignKey. Chấp nhận nó anyway vì câu trả lời chính nó là chính xác. – ThiefMaster

+2

@ThiefMaster Bạn có lẽ chỉ cần thiết lập primaryjoin về quan hệ của bạn - chúng không thể xác định hướng nối khi có nhiều quan hệ/backrefs giữa hai bảng. – letitbee

+0

Tôi đã tìm thấy thông tin tại đây: http://docs.sqlalchemy.org/en/rel_0_8/core/constraints.html –