2011-04-30 12 views
17

Mam dwie tabele, News i Files:SQLAlchemy circular dependency - jak go rozwiązać?

# 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')) 

Po dodaniu file_id_logo FKEY, sqlalchemy podniósł CircularDependencyError. Próbowałem już post_update=True w relacji logo, ale nic to nie zmieniło.

Jaki jest właściwy sposób rozwiązania tego problemu?

następujących przypadkach możliwe (w przypadku jest to ważne) są:

  • Plik nie ma wpływu lub dokładnie jeden Aktualności przypisane.
  • Jeśli plik nie zawiera żadnych wiadomości, nie ma również wiadomości z tym plikiem, do którego odnosi się logo.
  • Może istnieć wiele plików dla pojedynczej wiadomości, ale tylko jeden z tych plików może być jego numerem logo.
  • Tak więc jeśli wiadomość ma numer logo, plik z odniesieniem ma tę wiadomość także jako news.

Odpowiedz

22

use_alter - przekazywana do podstawowej metody ForeignKeyConstraint w celu wskazania, że ​​ograniczenie powinno być generowane/odrzucane na zewnątrz z instrukcji CREATE TABLE/DROP TABLE. Zobacz szczegóły konstruktora klas.

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

+0

działało dobrze, aby pozbyć się tego błędu, ale złamał kilka innych relacji. Postanowiłem więc po prostu pozbyć się klucza obcego. Akceptacja tego mimo że sama odpowiedź jest poprawna. – ThiefMaster

+2

@ ThiefMaster Prawdopodobnie wystarczy ustawić primaryjoin na swojej relacji - nie mogą określić kierunku łączenia, gdy istnieje wiele relacji/backrefów między dwiema tabelami. – letitbee

+0

Znalazłem informacje tutaj: http://docs.sqlalchemy.org/en/rel_0_8/core/constraints.html –