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?
SQLAlchemy can connect to more than one database at a time. It refers to different engines as “binds”. Flask-SQLAlchemy simplifies how binds work by associating each engine with a short string, a “bind key”, and then associating each model and table with a bind key.
Django, Pandas, Entity Framework, peewee, and MySQL are the most popular alternatives and competitors to SQLAlchemy.
One of which is that Flask-SQLAlchemy has its own API. This adds complexity by having its different methods for ORM queries and models separate from the SQLAlchemy API. Another disadvantage is that Flask-SQLAlchemy makes using the database outside of a Flask context difficult.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With