2013-02-22 9 views
9

Mam aplikację Flask, która używa Flask-SQLAlchemy i próbuję skonfigurować ją do korzystania z wielu baz danych w pakiecie Flask-Restless.Konfigurowanie Flask-SQLAlchemy do korzystania z wielu baz danych z Flask-Restless

Zgodnie z dokumentami (http://pythonhosted.org/Flask-SQLAlchemy/binds.html), konfigurowanie modeli do korzystania z wielu baz danych z __bind_key__ wydaje się dość proste.

Jednak to nie działa dla mnie.

tworzę aplikację i inicjalizacji mojej bazy danych tak:

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) 

Następnie określają swoje modele w tym __bind_key__, co powinien powiedzieć SQLAlchemy który DB musi używać:

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

Potem ogień Up Flask-Restless w ten sposób:

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) 

Aplikacja działa dobrze i kiedy trafię na http://localhost:5000/api/postgres_model/[id] otrzymuję oczekiwaną odpowiedź JSON obiektu z bazy danych Postgres DB (Zgaduję, że to dlatego, że mam poświadczenia w SQLALCHEMY_DATABASE_URI).

Chociaż po trafieniu http://localhost:5000/api/mysql_model/[id], otrzymuję komunikat o błędzie mysql_model_table, co oznacza, że ​​szuka w DB Postgres, a nie w MySQL.

Co ja tu robię źle?

Odpowiedz

11

ta nie działa z powodu prostego typo:

__bind_key = 'db1' 

powinny były

__bind_key__ = 'db1' 

zaktualizowałem oryginalne pytanie i ustalił literówkę jako przykład jak to może działać dla innych.

Powiązane problemy