Подтвердить что ты не робот

SQLalchemy не находит таблицу для создания внешнего ключа

У меня проблема с SQL Alchemy, пытаясь создать базу данных, я получаю:

"sqlalchemy.exc.NoReferencedTableError: внешний ключ, связанный с column 'estate_agent.person_id' не смог найти таблицу 'person' с который генерирует внешний ключ для целевого столбца" id"

Метаданные:

db = create_engine('postgresql+psycopg2:...//')
meta = MetaData()
meta.bind = db

Таблица лиц:

tbl_person = Table(
   'person', meta,
   Column('id', Integer, Sequence('seq_person_id'), primary_key=True),
   Column('name', String(100), unique=True, nullable = False),
   Column('password', String(40), nullable = False),
   Column('person_type_id', Integer, ForeignKey("person_type.id"), nullable = False),
   Column('register_date', DateTime, default = datetime.now),
   Column('pendencies', String(200)),
   Column('active', Boolean, default = True),
   schema = 'public')

Таблица ошибок:

tbl_estate_agent = Table(
   'estate_agent', meta,
   Column('person_id', Integer, ForeignKey("person.id"), primary_key = True),
   Column('prize_range_id', Integer, ForeignKey("prize_range.id"), nullable = False),
   schema = 'public')

Нормальная таблица (создающая обычно fk)

tbl_person_agent = Table(
   'person_agent', meta,
   Column('person_id', Integer, ForeignKey("person.id"), primary_key = True),
   Column('prize_range_id', Integer, ForeignKey("prize_range.id"), nullable = False),
   schema = 'public')

Создание вызова:

meta.create_all(checkfirst=True)

Завершить журнал ошибок:

Traceback (последний последний вызов): Файл "database_client.py", строка 159, в     meta.create_all (checkfirst = True) Файл "/usr/local/lib/python2.7/dist-packages/sqlalchemy/sql/schema.py", строка 3404, в create_all     table = tables) Файл "/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/base.py", строка 1616, в _run_visitor     conn._run_visitor (usercallable, element, ** kwargs) Файл "/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/base.py", строка 1245, в _run_visitor     ** kwargs).traverse_single (элемент) Файл "/usr/local/lib/python2.7/dist-packages/sqlalchemy/sql/visitors.py" , строка 120, в traverse_single     return meth (obj, ** kw) Файл "/usr/local/lib/python2.7/dist-packages/sqlalchemy/sql/ddl.py" , строка 699, в visit_metadata     collection = [t для t в sort_tables (таблицы) Файл "/usr/local/lib/python2.7/dist-packages/sqlalchemy/sql/ddl.py" , строка 862, в sort_tables     {'foreign_key': visit_foreign_key}) Файл "/usr/local/lib/python2.7/dist-packages/sqlalchemy/sql/visitors.py" , строка 256, в траверсе     return traverse_using (iterate (obj, opts), obj, visitors) Файл "/usr/local/lib/python2.7/dist-packages/sqlalchemy/sql/visitors.py" , строка 247, в traverse_using     meth (target) Файл "/usr/local/lib/python2.7/dist-packages/sqlalchemy/sql/ddl.py" , строка 853, в visit_foreign_key     parent_table = fkey.column.table Файл "/usr/local/lib/python2.7/dist-packages/sqlalchemy/util/langhelpers.py", строка 725, в получить    obj. dict [self. name] = result = self.fget(obj) Файл "/usr/local/lib/python2.7/dist-packages/sqlalchemy/SQL/schema.py", строка 1720, в строке столбца) sqlalchemy.exc.NoReferencedTableError: внешний ключ, связанный с column 'estate_agent.person_id' не смог найти таблицу 'person' с который генерирует внешний ключ для целевого столбца "id"

4b9b3361

Ответ 1

Добавление следующей строки в мою таблицу parent решило мою проблему. В случае декларативного:

children = relationship("Child")

В противном случае: SQLAlchemy - Classic Mapper

Также попробуйте заглянуть в здесь (SO), это может помочь.

Ответ 2

Решение состоит в том, чтобы заменить строки фактическими столбцами:

Column('person_id', Integer, ForeignKey(tbl_person.c.id), primary_key=True)

Ответ 3

В случае декларативного я решил эту проблему, просто импортировав класс, который был "не найден".

Ответ 4

Импортируйте фактические классы, как показано ниже:

from sqlalchemy import Integer, ForeignKey, String, Column

from sqlalchemy.ext.declarative import declarative_base

from sqlalchemy.orm import relationship

и для подавления предупреждений SQLAlchemy используйте в конфигурации следующую строку:

app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

Помимо этого, где находится таблица "price_range"? Добавьте таблицу price_range перед добавлением ForeignKey.