Кросс-база данных объединяется в sqlalchemy

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

Схема

  • db1.entity1
    • entity1_id: основной ключ
    • entity2_id: внешний ключ к db2.entity2.entity2_id
  • db2.entity2
    • entity2_id: первичный ключ

Model

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

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, которые не найдены. Я пробовал много разных комбинаций для __tablename__ без успеха. Поэтому мне было интересно, возможно ли это в SQLAlchemy.

Ответ 1

Вам, вероятно, нужно передать параметр 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')