PostgreSQLでデータベースを作成しました(8.4 - このバージョンを使用する必要があるのは、(まだ)9.0をサポートしていないMapFishを使用する必要があります)テーブルの継承:SQLAlchemyで継承されたPostgreSQLデータベースを反映すると、外部キー関係が失われる
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)
(earlier questionから学んだように、私はトリガーを使用して、私の主キーを追跡するために別々のテーブル(stakeholder_pk)を使用しています)
今、私は自分のデータベースを反映したいと思います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が発生します。 'stakeholder'と 'individual'の間に外部キーの関係が見つかりません。
私は親テーブル(ステークホルダー)の主キーを指す外部キーとして、子テーブルのプライマリキー(私の場合は個人)を使用するいくつかの例を見てきました。しかし、PostgreSQLは親テーブル(ステークホルダー)の主キーが存在しないので、これが外部キー制約に違反すると言って、これをやらせません(?)。
だから私はかなり詰まっていて、解決策を探して何時間も経てから、私はそれを見失ってしまっています。これはPostgreSQL(プライマリキー&の継承問題に似ています)の問題ですか、それともSQLAlchemyですか?それとも、私が根本的に何か悪いことをやっているだけですか?
私はこれを正しく理解しているかどうかはわかりませんが、答えをありがとう。私はすでに私の個人(最初のものと別の名前のプライマリキー)でこれらの行を持っています。問題は、pgAdminIIIのステークホルダーを見ると、行数は0です。しかし、SELECT * FROMステークホルダーに問い合わせると、すべての行がそこにありますか?ありがとうございました – lukas
私は最初の行を追加して2番目の行を置き換えることができます。または、淫らな人を取り除き、良い古い方法を考えてください。 – jordani