Настройка 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:[email protected]:5432/db_name'
SQLALCHEMY_BINDS = {
    'db1': SQLALCHEMY_DATABASE_URI,
    'db2': 'mysql://db_user:[email protected]: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] я получаю ожидаемый ответ JSON объекта из базы данных Postgres (я предполагаю, что это потому, что у меня есть его учетные данные в SQLALCHEMY_DATABASE_URI).

Хотя, когда я нажимаю http://localhost:5000/api/mysql_model/[id], я получаю mysql_model_table об ошибке mysql_model_table не существует, что указывает на то, что он смотрит в БД Postgres, а не в MySQL.

Что я здесь не так делаю?

Ответ 1

Это не работает из-за простой опечатки:

__bind_key = 'db1'

Должно быть

__bind_key__ = 'db1'

Я обновил исходный вопрос и исправил опечатку как пример того, как это может работать для других.