简体   繁体   English

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

[英]Configuring Flask-SQLAlchemy to use multiple databases with Flask-Restless

I have a Flask app that uses Flask-SQLAlchemy and I'm trying to configure it to use multiple databases with the Flask-Restless package. 我有一个使用Flask-SQLAlchemy的Flask应用程序,我正在尝试将其配置为使用Flask-Restless软件包使用多个数据库。

According to the docs , configuring your models to use multiple databases with __bind_key__ seems pretty straightforward. 根据文档 ,配置模型以使用__bind_key__使用多个数据库似乎非常简单。

However it doesn't seem to be working for me. 但它似乎对我不起作用。

I create my app and initialise my database like this: 我创建我的应用程序并初始化我的数据库,如下所示:

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)

Then define my models including __bind_key__ , which should tell SQLAlchemy which DB it needs to use: 然后定义我的模型,包括__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)
    ...

Then I fire up Flask-Restless like this: 然后我像这样点燃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)

The app runs fine and when I hit http://localhost:5000/api/postgres_model/[id] I get the expected JSON response of the object from the Postgres DB (I'm guessing this is because I have it's credentials in SQLALCHEMY_DATABASE_URI). 应用程序运行正常,当我点击http://localhost:5000/api/postgres_model/[id]我从Postgres DB获得对象的预期JSON响应(我猜这是因为我在SQLALCHEMY_DATABASE_URI中有它的凭据)。

Although when I hit http://localhost:5000/api/mysql_model/[id] , I get a mysql_model_table does not exist error, indicating that it's looking in the Postgres DB, not the MySQL one. 虽然当我点击http://localhost:5000/api/mysql_model/[id] ,我得到一个mysql_model_table不存在错误,表明它正在查找Postgres DB,而不是MySQL。

What am I doing wrong here? 我在这做错了什么?

This was not working because of a simple typo: 由于一个简单的拼写错误,这不起作用:

__bind_key = 'db1'

Should have been 本来应该

__bind_key__ = 'db1'

I've updated the original question and fixed the typo as an example of how this can work for others. 我已经更新了原始问题并修正了拼写错误,作为一个如何为其他人工作的例子。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM