Кросс базы данных объединяются в sqlalchemy - PullRequest
15 голосов
/ 22 июня 2011

Есть ли в SQLAlchemy способ выполнять кросс-базы данных? Чтобы быть конкретным, вот мой случай использования:

Схема

  1. db1.entity1
    1. entity1_id: первичный ключ
    2. entity2_id: внешний ключ для db2.entity2.entity2_id
  2. db2.entity2
    1. entity2_id: первичный ключ

Модель

Я использую декларативный стиль для моделей.

class Entity1(Base):
  __tablename__ = 'entity1' ## I tried combination of <db>.<table> with no success
  entity1_id = Column(Integer, primary_key=True)
  entity2_id = Column(Integer, ForeignKey('db2.entity2.entity2_id'))
  entity2 = relationship('Entity2')

class Entity2(Base):
  __tablename__ = 'entity2' ## I tried combination of <db>.<table> with no success
  entity2_id = Column(Integer, primary_key=True)

Теперь, как и ожидалось, мои запросы на Entity1 не выполняются с сообщениями об ошибках MySQL о том, что таблица entity2 не найдена. Я попробовал много разных комбинаций для __tablename__, но безуспешно. Мне было интересно, возможно ли это в SQLAlchemy.

1 Ответ

22 голосов
/ 22 июня 2011

Возможно, вам нужно передать параметр schema в sqlalchemy.schema.Table. При использовании декларативной базы для сопоставления ORM вы можете предоставить этот дополнительный параметр через свойство __table_args__ в ваших классах.

class Entity2(Base):
    __tablename__ = 'entity2' ## I tried combination of <db>.<table> with no success
    __table_args__ = {'schema': 'db2'}
    entity2_id = Column(Integer, primary_key=True) 

class Entity1(Base):
    __tablename__ = 'entity1' ## I tried combination of <db>.<table> with no success
    __table_args__ = {'schema': 'db1'}
    entity1_id = Column(Integer, primary_key=True)
    entity2_id = Column(Integer, ForeignKey(Entity2.entity2_id))
    entity2 = relationship('Entity2')
...