2013-02-22 63 views
9

के साथ एकाधिक डेटाबेस का उपयोग करने के लिए कॉन्फ़िगर करना मेरे पास एक फ्लास्क ऐप है जो फ्लास्क-स्क्लाक्लेमी का उपयोग करता है और मैं इसे फ्लास्क-रेस्टलेस पैकेज के साथ एकाधिक डेटाबेस का उपयोग करने के लिए कॉन्फ़िगर करने की कोशिश कर रहा हूं।फ्लास्क-एसक्यूएलकेमी को फ्लास्क-रेस्टलेस

दस्तावेज़ों के अनुसार (http://pythonhosted.org/Flask-SQLAlchemy/binds.html), __bind_key__ के साथ कई डेटाबेस का उपयोग करने के लिए अपने मॉडल को कॉन्फ़िगर करना बहुत सरल लगता है।

हालांकि यह मेरे लिए काम नहीं कर रहा है।

मैं अपने ऐप बना सकते हैं और इस तरह से मेरी डेटाबेस आरंभ:

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) 

फिर __bind_key__ सहित अपने मॉडल है, जो SQLAlchemy बताना चाहिए जो DB इसका इस्तेमाल करने की जरूरत है परिभाषित:

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

तो मैं आग फ्लास्क-अस्वस्थ इस तरह:

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) 

ऐप ठीक चलाता है और जब मैंने http://localhost:5000/api/postgres_model/[id] मारा तो मुझे पोस्टग्रेस डीबी से ऑब्जेक्ट की अपेक्षित JSON प्रतिक्रिया मिलती है (मुझे लगता है कि ऐसा इसलिए है क्योंकि मेरे पास SQLALCHEMY_DATABASE_URI में प्रमाण-पत्र हैं)।

हालांकि जब मैंने http://localhost:5000/api/mysql_model/[id] मारा, तो मुझे mysql_model_table त्रुटि नहीं मिली, यह दर्शाता है कि यह पोस्टग्रेस डीबी में देख रहा है, न कि MySQL एक।

क्या मैं गलत यहाँ कर रहा हूँ?

उत्तर

11

यह एक सरल टाइपो की वजह से काम नहीं कर रहा था:

__bind_key = 'db1' 

किया जाना चाहिए था

__bind_key__ = 'db1' 

मैं मूल प्रश्न अद्यतन और यह कैसे काम कर सकते हैं का एक उदाहरण के रूप में लिखने में गलती ठीक कर दी है दूसरो के लिए।