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”,用于生成目标列“PGDASD_00000_ID_DECLARACAO”的外键*

谢谢!

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 回答