配置Flask-SQLAlchemy与Flask-Restless使用多个数据库
我有一个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'
我已经更新了原来的问题,并修正了这个拼写错误,作为一个示例,帮助其他人理解如何解决类似的问题。