配置Flask-SQLAlchemy与Flask-Restless使用多个数据库

23 投票
1 回答
20359 浏览
提问于 2025-04-17 16:44

我有一个Flask应用,使用了Flask-SQLAlchemy,现在我想配置它来使用多个数据库,并且还想用Flask-Restless这个包。

根据文档,用__bind_key__来配置模型以使用多个数据库看起来很简单。

但是对我来说似乎不太管用。

我这样创建我的应用并初始化数据库:

from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy

SQLALCHEMY_DATABASE_URI = 'postgres://db_user:db_pw@localhost:5432/db_name'
SQLALCHEMY_BINDS = {
    'db1': SQLALCHEMY_DATABASE_URI,
    'db2': 'mysql://db_user:db_pw@localhost:3306/db_name'
}

app = Flask(__name__)
db = SQLALchemy(app)

然后定义我的模型,包括__bind_key__,这个应该告诉SQLAlchemy它需要使用哪个数据库:

class PostgresModel(db.Model):

    __tablename__ = 'postgres_model_table'
    __bind_key__ = 'db1'

    id = db.Column(db.Integer, primary_key=True)
    ...


class MySQLModel(db.Model):

    __tablename__ = 'mysql_model_table'
    __bind_key__ = 'db2'

    id = db.Column(db.Integer, primary_key=True)
    ...

接着我这样启动Flask-Restless:

manager = restless.APIManager(app, flask_sqlalchemy_db=db)
manager.init_app(app, db)

auth_func = lambda: is_authenticated(app)

manager.create_api(PostgresModel,
                   methods=['GET'],
                   collection_name='postgres_model',
                   authentication_required_for=['GET'],
                   authentication_function=auth_func)

manager.create_api(MySQLModel,
                   methods=['GET'],
                   collection_name='mysql_model',
                   authentication_required_for=['GET'],
                   authentication_function=auth_func)

应用运行得很好,当我访问http://localhost:5000/api/postgres_model/[id]时,我得到了来自Postgres数据库的预期JSON响应(我猜这是因为我在SQLALCHEMY_DATABASE_URI里有它的凭证)。

但是当我访问http://localhost:5000/api/mysql_model/[id]时,我却得到了一个mysql_model_table不存在的错误,这说明它在查找Postgres数据库,而不是MySQL数据库。

我这里做错了什么呢?

1 个回答

24

这个问题之所以没有解决,是因为一个简单的拼写错误:

__bind_key = 'db1'

应该是

__bind_key__ = 'db1'

我已经更新了原来的问题,并修正了这个拼写错误,作为一个示例,帮助其他人理解如何解决类似的问题。

撰写回答