Самореференциальная связь SQLAlchemy - NoReferencedTableError - PullRequest
1 голос
/ 22 марта 2011

Я использую SA 0.6.6, Декларативный стиль, против Postgres 8.3, для отображения объектов Python в базе данных. У меня есть таблица, которая ссылается на себя, и я пытаюсь создать свойство отношений для его детей. Независимо от того, что я пытаюсь, я получаю NoReferencedTableError.

Мой код выглядит в точности как пример кода с веб-сайта SA о том, как это сделать .

Вот класс.

class FilterFolder(Base):
    __tablename__ = 'FilterFolder'
    id = Column(Integer,primary_key=True)
    name = Column(String)
    isShared = Column(Boolean,default=False)
    isGlobal = Column(Boolean,default=False)
    parentFolderId = Column(Integer,ForeignKey('FilterFolder.id'))
    childFolders = relationship("FilterFolder",
                    backref=backref('parentFolder', remote_side=id)
                    )

Вот ошибка, которую я получаю:

NoReferencedTableError: внешнему ключу, связанному со столбцом «FilterFolder.parentFolderId», не удалось найти таблицу «FilterFolder», с помощью которой можно сгенерировать внешний ключ для целевого столбца «id»

Есть идеи, что я здесь не так делаю?

Ответы [ 2 ]

2 голосов
/ 23 марта 2011

Это была глупая ошибка с моей стороны.Обычно я задаю свой FK, указав тип Entity, а не строку.Я использую разные схемы, поэтому при определении сущности FK в виде строки мне также нужна схема.

Сломана:

parentFolderId = Column(Integer,ForeignKey('FilterFolder.id'))

Исправлено:

parentFolderId = Column(Integer,ForeignKey('SchemaName.FilterFolder.id'))
1 голос
/ 23 марта 2011

Я проверил ваш код с помощью SQLAlchemy 0.6.6 и sqlite.Мне удалось создать таблицы, добавить родительскую и дочернюю комбинацию и снова получить их, используя session.query.

Насколько я могу судить, упомянутое вами исключение (NoReferencedTableError) генерируется исключительно в schema.py (в источнике SQLAlchemy) и не зависит от базы данных.

Некоторые вопросы: Вы видите ту же ошибку, если вы используете sqlite URL вместо Postgres?Как вы создаете свою схему?Моя выглядит примерно так:

engine = create_engine(db_url)
FilterFolder.metadata.create_all(self.dbengine)
...