2

SqlAlchemy に問題があります。Oracle データベースでスキーマを定義すると、他のテーブルで外部キーが認識されません。レイアウトを使用せずにテストしたところ、うまくいきました。しかし、ユーザーはテーブルの所有者ではないため、このアプリケーションのスキーマを定義する必要があります。この問題を解決するためにあなたの助けをお願いします。コード:

Base = declarative_base()
SCHEMA = {'schema' : 'SIATDESV'}

class Pgdasd(Base):
    __tablename__ = 'PGDASD'
    __table_args__ = SCHEMA

    PGDASD_00000_ID_DECLARACAO    = Column(String(17), primary_key = True)

class Pgdasd_01000(Base):
    __tablename__ = 'pgdasd_01000'
    __table_args__ = SCHEMA

    PGDASD_00000_ID_DECLARACAO  = Column(String, ForeignKey('PGDASD.PGDASD_00000_ID_DECLARACAO'))   
    PGDASD_01000_NRPAGTO        = Column(String, primary_key = True)

エラー: *列 'pgdasd_01000.PGDASD_00000_ID_DECLARACAO' に関連付けられた外部キーは、ターゲット列 'PGDASD_00000_ID_DECLARACAO' への外部キーを生成するテーブル 'PGDASD' を見つけることができませんでした*

ありがとう!

4

1 に答える 1

0

ステップ 1: テーブルが db に作成されていることを確認します。ところで、これらのテーブルをどのように作成しましたか? メソッドを実行しましたmetadata.create_all()か?

ステップ 2: スキーマの名前を ForeignKey 定義に追加してみてください。

Base = declarative_base()
SCHEMA = {'schema' : 'SIATDESV'}

class Pgdasd(Base):
    __tablename__ = 'PGDASD'
    __table_args__ = SCHEMA

    PGDASD_00000_ID_DECLARACAO    = Column(String(17), primary_key = True)

class Pgdasd_01000(Base):
    __tablename__ = 'pgdasd_01000'
    __table_args__ = SCHEMA

    PGDASD_00000_ID_DECLARACAO  = Column(String, ForeignKey('SIATDESV.PGDASD.PGDASD_00000_ID_DECLARACAO'))   
    PGDASD_01000_NRPAGTO        = Column(String, primary_key = True)

これが役立つ場合は、スキーマ値を使用するコードを作成して、スキーマのハードコーディングを回避することもできます。

    PGDASD_00000_ID_DECLARACAO  = Column(String, ForeignKey(SCHEMA['schema']+'.PGDASD.PGDASD_00000_ID_DECLARACAO'))   

PS: とにかく、SQLAlchemy ログが生成する SQL クエリを確認することは常に役に立ちます。

于 2013-05-31T22:57:42.327 に答える