SQLalchemy Декларативные + отношения в нескольких разных базах данных

Мне потребовалось некоторое время, но я понял, как использовать SQLALCHEMY, чтобы моделировать отношения между двумя различными видами баз данных. :

Base = declarative_base()

class Survey(Base):
    __tablename__ = 'SURVEY'

    survey_id = Column("SURVEY_ID", Integer, primary_key=True)
    term_id = Column("TERM_ID", Integer, nullable=False)

    # Because the TERM table is in Oracle, but the SURVEY table is in
    # MySQL, I can't rely on SQLAlchemy's ForeignKey.  Thus,
    # I need to specify the relationship entirely by hand, like so:
    term = relationship("Term",
        primaryjoin="Term.term_id==Survey.term_id",
        foreign_keys=[term_id],
        backref="surveys"
    )

class Term(Base):
    __tablename__ = 'TERM'

    term_id   = Column(Integer, primary_key=True)
    term_name = Column(String(30))
    start_date = Column(Date)
    end_date = Column(Date)

mysql_engine = create_engine(MYSQL)
oracle_engine = create_engine(ORACLE)

Session = scoped_session(sessionmaker(
    binds={
        Term: oracle_engine,
        Survey: mysql_engine
    }
))

if __name__ == "__main__":
    survey = Session.query(Survey).filter_by(survey_id=8).one()
    print survey.term
    print survey.term.surveys

Я должен сделать это, потому что термин таблица находится в базе данных Oracle, на которой у меня только прочитанный доступ, и я пишу приложение, которое записывает опросы, взятые студентами, об этом сроком.

выше Работает, но это очень хрупко, когда количество таблиц поднимается вверх, так как сеанс должен указывать именно, какой сопоставленный класс es соответствует какому двигателю. Я бы очень хотел использовать различные базу , чтобы определить, какие таблицы принадлежат к какому двигателю, вместо того, чтобы привязывать каждую таблицу индивидуально. Вроде это:

mysql_engine = create_engine(MYSQL)
oracle_engine = create_engine(ORACLE)

MySQLBase = declarative_base(bind=mysql_engine)
OracleBase = declarative_base(bind=oracle_engine)

class Survey(MySQLBase):
    __tablename__ = 'SURVEY'

    survey_id = Column("SURVEY_ID", Integer, primary_key=True)
    term_id = Column("TERM_ID", Integer, nullable=False)


class Term(OracleBase):
    __tablename__ = 'ads_term_v'

    term_id   = Column(Integer, primary_key=True)
    term_name = Column(String(30))
    start_date = Column(Date)
    end_date = Column(Date)

Survey.term = relationship("Term",
    primaryjoin="Term.term_id==Survey.term_id",
    foreign_keys=[Survey.term_id],
    backref="surveys"
)

Session = scoped_session(sessionmaker())

if __name__ == "__main__":
    survey = Session.query(Survey).filter_by(survey_id=8).one()
    print survey.term
    print survey.term.surveys

К сожалению, это приводит к следующей ошибке, когда запрос работает:

SQLALCHEMY.EXC.invalidrequestError: при инициализации Mapper Mapper | Обследование | Обследование, выражение «Term.term_id == Survey.term_id» не удалось Найдите имя («Имя» термин «Не определено»). Если это имя класса, рассмотрите возможность добавления этих отношений () в класс после определения обоих зависимых классов».

Несмотря на то, что I сделал , добавляю отношение () к опросу после определения срока.

У кого-нибудь есть какие-то предложения?

13
задан coredumperror 15 September 2011 в 18:23
поделиться