Я пытаюсь прочитать представление , определенное в Postgresql как ' проекты ', которое объединяет две таблицы: ' entity_registry ' и 'проект ».Я определил класс 'Project' в Python, сопоставленный с этим представлением с помощью SQLM-конструкций sqlalchemy.Представление postgresql хорошо сформировано, о чем свидетельствует тот факт, что его можно без проблем извлечь из таких инструментов, как Navicat и PyCharm.Тем не менее, попытки выполнить мой код не удается с ошибкой:
sqlalchemy.exc.NoForeignKeysError: Не удается найти какие-либо отношения внешнего ключа между 'entity_registry'and' projects '.
Чего мне не хватает?Конечно, отношение внешнего ключа между этими двумя таблицами устанавливается в конструкции представления в postgresql и не должно раскрываться в sqlalchemy.
Большая часть документации, которую я нашел, относится к связыванию двух таблиц в Python / sqlalchemy.Мне не удалось найти примеры, когда представление определено в postgresql (или другой СУБД) и затем получило доступ, как если бы оно было обычной таблицей.
Вот SQL в postgresql, определяющий представление:
Select
entity_registry.name,
entity_registry.description,
entity_registry.state,
entity_registry.id,
entity_registry.status,
entity_registry.parent_id,
entity_registry.created_at,
entity_registry.created_by,
entity_registry.category,
project.budget,
project.planned_start,
project.planned_finish,
project.actual_start,
project.actual_finish,
FROM (itg.project
JOIN vp.entity_registry ON ((project.project_id = entity_registry.id)))
... и вот модель, определенная в моем коде Python:
class Project(Entity):
__tablename__ = 'projects' # Name of the View in postgresql
__table_args__ = {'schema': 'itg'}
# These fields are from the 'entity_registry' postgresql table
project_id = Column('id', Integer(), primary_key=True)
name = Column(String(), nullable=False)
description = Column(String(), nullable=False)
category = Column(String(), nullable=True)
state = Column('state', String(6), nullable=True)
status = Column('status', String(6), nullable=True)
# These fields are from the 'project' postgresql table
budget = Column(Float(), nullable=True)
planned_start = Column(DateTime(), nullable=True)
planned_finish = Column(DateTime(), nullable=True)
actual_start = Column(DateTime(), nullable=True)
actual_finish = Column(DateTime(), nullable=True)