Я создал базу данных в 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? Или я просто что-то делаю не так?