使用SQLAlchemy的Oracle数据库模式

时间:2013-05-31 18:47:59

标签: python oracle sqlalchemy schema

我遇到了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'*

谢谢!

1 个答案:

答案 0 :(得分:0)

步骤1:检查是否在db中创建了表。 BTW你是如何创建这些表的?你运行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查询总是有用的。