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

时间:2013-02-22 09:52:15

标签: python flask flask-sqlalchemy

我有一个使用Flask-SQLAlchemy的Flask应用程序,我尝试将其配置为使用Flask-Restless软件包使用多个数据库。

根据the docs,将模型配置为使用__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它需要使用哪个DB:

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 个答案:

答案 0 :(得分:12)

由于一个简单的拼写错误,这不起作用:

__bind_key = 'db1'

应该是

__bind_key__ = 'db1'

我已经更新了原始问题并修正了拼写错误,以此作为其他人如何运作的示例。