Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Configuring Flask-SQLAlchemy to use multiple databases with Flask-Restless

Tags:

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?

like image 677
Chris McKinnel Avatar asked Feb 22 '13 09:02

Chris McKinnel


People also ask

How do I use multiple databases in Flask?

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.

Is there something better than SQLAlchemy?

Django, Pandas, Entity Framework, peewee, and MySQL are the most popular alternatives and competitors to SQLAlchemy.

What is the difference between Flask-SQLAlchemy and 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.


1 Answers

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.

like image 152
Chris McKinnel Avatar answered Sep 28 '22 19:09

Chris McKinnel