Отражение базы данных PostgreSQL с наследованием в SQLAlchemy приводит к отсутствию отношения внешнего ключа - PullRequest
1 голос
/ 13 июля 2011

Я создал базу данных в PostgreSQL (8.4 - мне нужно использовать эту версию, потому что я хочу использовать MapFish, которая (пока) не поддерживает 9.0), которая имеет некоторые унаследованные таблицы:

CREATE TABLE stakeholder
(
    pk_stakeholder integer DEFAULT nextval('stakeholder_seq') NOT NULL,
    fk_stakeholder_type integer NOT NULL,
    name character varying(255) NOT NULL,
    CONSTRAINT stakeholder_primarykey PRIMARY KEY (pk_stakeholder),
    CONSTRAINT stakeholder_fk_stakeholder_type FOREIGN KEY (fk_stakeholder_type)
            REFERENCES stakeholder_type (pk_stakeholder_type) MATCH SIMPLE
            ON UPDATE CASCADE ON DELETE NO ACTION
);
CREATE TABLE individual
(
    firstname character varying(50),
    fk_title integer,
    email1 character varying (100),
    email2 character varying (100),
    phone1 character varying (50),
    phone2 character varying (50),
    CONSTRAINT individual_primarykey PRIMARY KEY (pk_stakeholder),
    CONSTRAINT individual_fk_title FOREIGN KEY (fk_title)
            REFERENCES individual_title (pk_individual_title) MATCH SIMPLE
            ON UPDATE CASCADE ON DELETE NO ACTION
) INHERITS (stakeholder)

(как выяснилось из более раннего вопроса , я использую отдельную таблицу (заинтересованных лиц) для отслеживания моих первичных ключей с помощью триггеров)

Теперь я хотел бы отразить свою базу данных в SQLAlchemy (0.7.1):

meta.metadata.reflect(bind=engine)
table_stakeholder = meta.metadata.tables["stakeholder"]
table_individual = meta.metadata.tables["individual"]
stakeholder_mapper = orm.mapper(Stakeholder, table_stakeholder,
    polymorphic_on=table_stakeholder.c.fk_stakeholder_type,
    polymorphic_identity='stakeholder')
orm.mapper(Individual, table_individual, inherits=stakeholder_mapper,
    polymorphic_identity='individual')

Это, однако, приводит к sqlalchemy.exc.ArgumentError: Невозможно найти какие-либо отношения внешнего ключа между «заинтересованным лицом» и «отдельным».

Теперь я видел несколько примеров, в которых они используют первичный ключ дочерних таблиц (в моем случае: индивидуальный) в качестве внешнего ключа для указания на первичный ключ родительской таблицы (заинтересованная сторона). Однако PostgreSQL не позволит мне сделать это, заявив, что это нарушит ограничение внешнего ключа, поскольку первичного ключа в родительской таблице (стейкхолдер) там нет (?).

Так что теперь я в значительной степени застрял и после нескольких часов поиска решения, я начинаю терять его. Это проблема в PostgreSQL (похожая на проблему первичного ключа и наследования) или это связано с SQLAlchemy? Или я просто что-то делаю не так?

1 Ответ

1 голос
/ 13 июля 2011

Это в PostgreSQL:

Все проверочные и ненулевые ограничения родительской таблицы автоматически наследуются ее дочерними элементами.Другие типы ограничений (уникальный, первичный ключ и ограничения внешнего ключа) не наследуются.

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

http://www.postgresql.org/docs/9.0/interactive/ddl-inherit.html

Можно ли сбрасывать триггеры и иметь в индивидуальном порядке:

    pk_stakeholder integer DEFAULT nextval('stakeholder_seq') NOT NULL, 
...
    CONSTRAINT stakeholder_primarykey PRIMARY KEY (pk_stakeholder), 

Это не помешает индивидууму иметь pk_stakeholder, который существует в заинтересованной стороне, если выобновите pk_stakeholder позже.Так что здесь триггеры необходимы, чтобы остановить обновление (проще) или проверить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...