2013-02-22 9 views
9

Ho un'app Flask che usa Flask-SQLAlchemy e sto provando a configurarlo per utilizzare più database con il pacchetto Flask-Restless.Configurazione di Flask-SQLAlchemy per utilizzare più database con Flask-Restless

Secondo i documenti (http://pythonhosted.org/Flask-SQLAlchemy/binds.html), la configurazione dei modelli per utilizzare più database con __bind_key__ sembra piuttosto semplice.

Tuttavia non sembra funzionare per me.

creo la mia app e l'inizializzazione mio database come questo:

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) 

Quindi definire i miei modelli tra cui __bind_key__, che dovrebbe dire SQLAlchemy che DB ha bisogno di usare:

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) 
    ... 

Poi sparo up Flask-Restless in questo modo:

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) 

L'app funziona bene e quando colpisco http://localhost:5000/api/postgres_model/[id] ottengo la risposta JSON attesa dell'oggetto dal DB Postgres (suppongo che questo sia perché ho le credenziali in SQLALCHEMY_DATABASE_URI).

Sebbene quando ho colpito http://localhost:5000/api/mysql_model/[id], ottengo un errore mysql_model_table inesistente, a indicare che sta cercando nel DB Postgres, non in quello MySQL.

Cosa sto facendo di sbagliato qui?

risposta

11

Questo non funzionava a causa di un semplice errore di battitura:

__bind_key = 'db1' 

Avrebbe dovuto essere

__bind_key__ = 'db1' 

Ho aggiornato la domanda originale e fissato l'errore di battitura come un esempio di come questo può funzionare per gli altri.

Problemi correlati