2017-06-03 10 views
8

मुझे दो डेटाबेस कनेक्ट करने की आवश्यकता है। डिफ़ॉल्ट डेटाबेस तय किया गया है लेकिन दूसरा एक गतिशील है, यह यूआरएल पर आधारित है।गतिशील डेटाबेस कनेक्शन फ्लास्क-एसक्यूएलकेमी

उदाहरण के लिए यदि यूआरएल है: yourapp.myweb.com तो दूसरी डेटाबेस नाम yourapp

मैं कोशिश init .py लेकिन इसकी निम्नलिखित मुझे दिखाओ त्रुटि में डेटाबेस से कनेक्ट हो जाएगा

builtins.AssertionError 
AssertionError: A setup function was called after the first request was handled. This usually indicates a bug in the application where a module was not imported and decorators or other functionality was called too late. 
To fix this make sure to import all your view modules, database models and everything related at a central place before the application starts serving requests. 

यहाँ मेरी init .py है

from flask import Flask,session 
from flask_sqlalchemy import SQLAlchemy 
import os 
app = Flask(__name__,static_url_path='/static') 

# Database Connection 
database = request.url.split("/")[2].split(".")[0] 
app.config['SQLALCHEMY_DATABASE_URI'] = "mysql+pymysql://root:[email protected]/main_database" 
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True 
app.config['SQLALCHEMY_BINDS'] = { 
    'user_db': 'mysql+pymysql://root:[email protected]/database_'+str(database), #dynamic Connection 
} 
db = SQLAlchemy(app) 
db.create_all() 
db.create_all(bind=['user_db']) 
# db.init_app(app) 

from . import views 

यहाँ यहाँ viwe.py

@app.route('/login', methods = ['GET']) 
def index(): 
    try: 
     from .model import Users 
     # Some Code 
    except Exception as e: 
     raise e 
     # return "Failed to login ! Please try again." 

है model.py

from application import db 
class Users(db.Model): 
    __bind_key__ = 'user_db' 
    __tablename__ = 'users' 
    id = db.Column(db.Integer, primary_key = True) 
    email = db.Column(db.String(50)) 
    name = db.Column(db.String(50)) 
    password = db.Column(db.String()) 

    def __repr__(self): 
     return '<User %r>' % self.name 
+0

मुझे लगता है कि जब मैं अपना ऐप शुरू करता हूं तो इसका कोई अनुरोध नहीं होता है। इसलिए ऐसा हो सकता है .. –

+0

यदि समस्या से ऊपर है तो कौन सा .py फ़ाइल डेटाबेस कनेक्ट करने के लिए सबसे अच्छा है? –

+0

मॉड्यूल के शीर्ष स्तर पर '.model आयात उपयोगकर्ताओं' से रखने का प्रयास करें। – Fian

उत्तर

4

है जैसा कि मैंने मेरी टिप्पणी से एक में कहा, इस डेटाबेस कनेक्शन के साथ एक समस्या हो सकती है। यहाँ मैं क्या के लिए जाँच करेंगे:

  1. सबसे पहले, सुनिश्चित करें कि आप सही इंजन अपने आभासी वातावरण में स्थापित (आप pip list चलाकर आसानी से देख सकते है बनाने, बस मामले में, मुझे कहना है कि पुस्तकालयों की आवश्यकता है virtual environment में स्थापित किया जाना है)। सुनिश्चित करें कि आपके पास pymysql नहीं है, लेकिन पाइथन 3 के पोर्ट को mysqlclient कहा जाता है। pymysql केवल Python2 के साथ काम करता है। इस पुस्तकालय को स्थापित करने के लिए, आपको पहले पायथन और MySQL विकास शीर्षलेख स्थापित करने की आवश्यकता है। उदाहरण के लिए, Debian/Ubuntu में:

    sudo apt-get install python-dev libmysqlclient-dev 
    

    तो फिर तुम पुस्तकालय निम्नलिखित कमांड के साथ स्थापित कर सकते हैं:

    pip install mysqlclient 
    
  2. इस स्थापित है, तो सुनिश्चित करें कि आप वास्तव में का उपयोग कर डेटाबेस से कनेक्ट कर सकते हैं पुस्तकालय। फिर यह आप;

    import pymysql.cursors 
    
    connection = pymysql.connect(host='<you_host>', 
              user='<user>', 
              password='<password>', 
              db='<database_name>', 
              charset='utf8mb4', 
              cursorclass=pymysql.cursors.DictCursor) 
    
    try: 
        with connection.cursor() as cursor: 
         do_something() 
    except: 
        pass 
    
  3. इस काम करता है, सुनिश्चित करें कि आप बोतल (0.12 at the moment का नवीनतम संस्करण चला रहे हैं: आभासी वातावरण में एक अजगर खोल खोलें और निम्न (उदाहरण से github में) टाइप pip list चलाकर जांच सकते हैं), क्योंकि समय के साथ तय किए गए DEBUG मोड में चल रहे फ्लास्क से संबंधित कई बग हैं।

  4. यह निश्चित रूप से यहां मामला नहीं है, लेकिन एक और सैनिटी चेक यह सत्यापित कर रहा है कि पोर्ट पर कोई अन्य प्रक्रिया नहीं चल रही है जिसे आप फ्लास्क के लिए उपयोग करना चाहते हैं।

यदि उपरोक्त में से सब ठीक काम कर रहा है, मैं स्टैक ट्रेस का एक सा देखने के लिए क्या वास्तव में हो रहा है यह पता लगाने की आवश्यकता होगी।

+0

एंटोनियो हारो आपके सुझाव का धन्यवाद। लेकिन यह अभी भी त्रुटि देते हैं। –

+0

बात मैं यूआरएल से डेटाबेस नाम प्राप्त करने की आवश्यकता [2] .split ("।") [0] अपने यहां से बंद कर दिया है और मैं इस डेटाबेस = request.url.split ("/") की तरह डेटाबेस nane प्राप्त करने की कोशिश । –

संबंधित मुद्दे