Configuring Flask-SQLAlchemy to use multiple databases with Flask-Restless
flask, flask-sqlalchemy, python
Solution
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.
Problem
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. According to the docs, configuring your models to use multiple databases with `__bind_key__` seems pretty straightforward. 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: ``` 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: ``` 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). 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. What am I doing wrong here?