2013-05-31 4 views
2

У меня проблема с SqlAlchemy. Когда я определяю схему в моей базе данных Oracle, внешние ключи не распознаются в других таблицах. Протестировано без использования макета, и это сработало. Но мне нужно определить схему этого приложения, потому что пользователь не является владельцем таблиц. Я хотел бы помочь вам решить эту проблему. код:Схема базы данных Oracle с использованием SQLAlchemy

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» *

спасибо!

+0

Не могли бы вы добавить следующую информацию из журналов - создать табличные запросы, сгенерированные SQLAlchemy? – vvladymyrov

ответ

0

Шаг 1: проверьте, что таблицы (таблицы) созданы в db. BTW Как вы создали эти таблицы? Пропустили ли вы метод metadata.create_all()?

Шаг 2: Попробуйте добавить имя схемы в ForeignKey Defintion:

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 запросы, которые он генерирует.

+0

Проблема продолжается ... Когда я вставил внешний ключ в схему, сгенерировал ту же ошибку. – fredsilva

+0

Убедитесь, что в схеме 'SIATDESV' есть таблица' PGDASD', и она имеет такой столбец. – vvladymyrov

+0

Запустите следующий запрос в sqlplus: 'выберите PGDASD_00000_ID_DECLARACAO из SIATDESV.PGDASD;', чтобы проверить, существует ли такая таблица в db. DB будет жаловаться, если нет такой таблицы или столбца. – vvladymyrov