Циклическая зависимость SQLAlchemy - как ее решить? - PullRequest
18 голосов
/ 30 апреля 2011

У меня есть две таблицы, News и Files:

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

После добавления клавиши file_id_logo SQLalchemy вызвал ошибку CircularDependencyError. Я уже пробовал post_update=True в отношении logo, но это ничего не изменило.

Как правильно решить эту проблему?

Возможны следующие случаи (если это имеет значение):

  • Файлу не назначены или точно назначены новости.
  • Если у файла нет новостей, то также нет новостей с этим файлом, на которые ссылается его логотип.
  • Для одной новости может быть несколько файлов, но только один из этих файлов может быть logo.
  • Так что, если у News есть logo, указанный файл также имеет эту новость как news.

1 Ответ

23 голосов
/ 30 апреля 2011

use_alter - передается в базовый ForeignKeyConstraint, чтобы указать, что ограничение должно быть сгенерировано / удалено извне из оператора CREATE TABLE / DROP TABLE. Подробности смотрите в конструкторе классов.

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

...