2011-07-12 5 views
1

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ですか?それとも、私が根本的に何か悪いことをやっているだけですか?

答えて

1

これは、PostgreSQLである:

親テーブル上のすべてのチェック制約と非NULL制約が自動的にその子に継承されます。他のタイプの制約(一意キー、主キー、および外部キー制約)は継承されません。

これらの不具合は、将来のリリースで修正される可能性がありますが、その間に継承がアプリケーションに役立つかどうかを決定する際にはかなり注意が必要です。

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を持って停止することはありません。したがって、ここでトリガーは更新を止める(簡単に)か、チェックする必要があります。

+0

私はこれを正しく理解しているかどうかはわかりませんが、答えをありがとう。私はすでに私の個人(最初のものと別の名前のプライマリキー)でこれらの行を持っています。問題は、pgAdminIIIのステークホルダーを見ると、行数は0です。しかし、SELECT * FROMステークホルダーに問い合わせると、すべての行がそこにありますか?ありがとうございました – lukas

+0

私は最初の行を追加して2番目の行を置き換えることができます。または、淫らな人を取り除き、良い古い方法を考えてください。 – jordani

関連する問題