2011-06-22 15 views
11

¿Existe alguna forma en SQLAlchemy de realizar uniones entre bases de datos? Para ser más específicos, aquí es mi caso de uso:Unir base de datos cruzada en sqlalchemy

esquema

  1. db1.entity1
    1. entity1_id: Clave primaria
    2. entity2_id: clave externa a db2.entity2.entity2_id
  2. db2.entity2
    1. entity2_id: Clave primaria

Modelo

estoy usando estilo declarativo para los modelos.

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) 

Ahora, como esperaba, mis consultas para Entity1 están fallando con los mensajes de error de MySQL diciendo que la tabla entity2 no se ha encontrado. Probé muchas combinaciones diferentes para __tablename__ sin éxito. Entonces me preguntaba si es posible en SQLAlchemy.

Respuesta

14

Probablemente necesite pasar el parámetro schema a sqlalchemy.schema.Table. Al usar la base declarativa para la asignación de ORM, puede proporcionar este parámetro adicional a través de la propiedad __table_args__ en sus clases.

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') 
+0

Gracias @TokenMacGuy. '__table_args__' funcionó. – Vikas

Cuestiones relacionadas