使用Flask-SQLAlchemy进行多对多多数据库连接

时间:2012-07-11 17:41:56

标签: python sqlalchemy flask flask-sqlalchemy

我正在尝试与Flask-SQLAlchemy和两个MySQL数据库进行多对多连接,除非它使用错误的数据库连接表,否则它非常接近。这是基础......

我有main_dbvendor_db。表格设置为main_db.usersmain_db.user_products(关系表),然后是vendor_db.products。应该很清楚这些是如何连接起来的。

在我的app.py中,我正在设置这样的数据库:

app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://user:pass@localhost/main_db'
app.config['SQLALCHEMY_BINDS'] = {
        'vendor_db': 'mysql://user:pass@localhost/vendor_db'
}

模型定义设置如下:

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))

问题在于,当我尝试获取用户的产品时,它会尝试将vendor_db用于连接表而不是main_db。我有什么想法可以让它使用main_db代替?我已尝试设置另一个绑定到main_db并在关系表定义上设置info={'bind_key': 'main_db'},但没有运气。谢谢!

1 个答案:

答案 0 :(得分:11)

原来我需要做的是在我的user_products_tbl表定义中指定模式。所以,

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

希望这有助于其他人!