Tôi giả sử rằng thông báo lỗi là đúng:thực sự trong cơ sở dữ liệu của bạn, bạn có 2 hàng liên kết Location
và Heading
các trường hợp. Trong trường hợp này, bạn nên tìm hiểu nơi và tại sao điều này xảy ra ngay từ đầu và ngăn điều này xảy ra lần nữa
-
Trước tiên, để xác nhận giả định này, bạn có thể chạy truy vấn sau đối với cơ sở dữ liệu của mình:
q = session.query( headings_locations.c.location_id, headings_locations.c.heading_id, sa.func.count().label("# connections"), ).group_by( headings_locations.c.location_id, headings_locations.c.heading_id, ).having( sa.func.count() > 1 )
-
Giả sử, giả định được xác nhận, sửa chữa nó bằng cách xóa thủ công tất cả các bản sao trong cơ sở dữ liệu của bạn (chỉ để lại một bản cho mỗi cái).
-
Sau đó, thêm UniqueConstraint tới
headings_locations
của bạn bảng:headings_locations = db.Table('headings_locations', db.Column('id', db.Integer, primary_key=True), db.Column('location_id', db.Integer(), db.ForeignKey('location.id')), db.Column('headings_id', db.Integer(), db.ForeignKey('headings.id')), db.UniqueConstraint('location_id', 'headings_id', name='UC_location_id_headings_id'), )
Lưu ý rằng bạn cần phải thêm nó vào cơ sở dữ liệu, chỉ thêm nó vào sqlalchemy
là chưa đủ mô hình.
Giờ đây, mã nơi các bản sao được chèn do nhầm lẫn sẽ không thành công với ngoại lệ vi phạm ràng buộc duy nhất và bạn có thể khắc phục gốc rễ của vấn đề.