2012-07-11 26 views
5

Estoy tratando de hacer que este muchos-a-muchos trabajen con Flask-SQLAlchemy y dos bases de datos MySQL, y está muy cerca excepto que está usando la base de datos incorrecta la mesa de unión. Aquí está lo básico ...Muchos-a-muchos multi-base de datos se unen con Flask-SQLAlchemy

Tengo main_db y vendor_db. Las tablas se configuran como main_db.users, main_db.user_products (la tabla de relaciones) y luego vendor_db.products. Debería ser bastante claro cómo están todos conectados.

en mi app.py, estoy servido para su creación las bases de datos de la siguiente manera:

app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://user:[email protected]/main_db' 
app.config['SQLALCHEMY_BINDS'] = { 
     'vendor_db': 'mysql://user:[email protected]/vendor_db' 
} 

las definiciones del modelo se establecen así:

from app import db 

# Setup relationship 
user_products_tbl = db.Table('user_products', db.metadata, 
     db.Column('user_id', db.Integer, db.ForeignKey('users.user_id')), 
     db.Column('product_id', db.Integer, db.ForeignKey('products.product_id')) 
) 

class User(db.Model): 
    __tablename__ = 'users' 
    id = db.Column('user_id', db.Integer, primary_key=True) 
    products = db.relationship("Product", secondary=user_products_tbl, 
      backref="users", lazy="dynamic") 

class Product(db.Model): 
    __bind_key__ = 'vendor_db' 
    __tablename__ = 'products' 
    id = db.Column('product_id', db.Integer, primary_key=True) 
    name = db.Column(db.String(120)) 

El problema es que cuando intento obtener los productos de un usuario que está tratando de usar vendor_db para la tabla de unión en lugar de main_db. ¿Alguna idea de cómo puedo hacer que use main_db? Intenté configurar otro enlace a main_db y estableciendo info={'bind_key': 'main_db'} en la definición de la tabla de relaciones, pero no tuve suerte. ¡Gracias!

Respuesta

10

Resulta que lo que tenía que hacer aquí era especificar el esquema en mi definición de tabla user_products_tbl. Por lo tanto,

user_products_tbl = db.Table('user_products', db.metadata, 
     db.Column('user_id', db.Integer, db.ForeignKey('users.user_id')), 
     db.Column('product_id', db.Integer, db.ForeignKey('products.product_id')), 
     schema='main_db' 
) 

Espero que esto ayude a alguien más!

Cuestiones relacionadas