2017-06-03 216 views
8

我需要連接兩個數據庫。默認數據庫是固定的,但另一個是動態的,它基於URL。動態數據庫連接Flask-SQLAlchemy

例如,如果網址是:yourapp.myweb.com然後第二個數據庫的名字將是yourapp

我嘗試連接到數據庫初始化的.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. 

這裏是我的初始化的.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

我認爲當我開始我的應用程序它沒有任何request.url因此可能是.. –

+0

如果有上述問題,然後哪個.py文件最好連接數據庫? –

+0

嘗試將'from .model import Users'放在模塊的頂層。 – Fian

回答

4

正如我在我的意見一說,這可能是與數據庫的連接有問題。這是我想檢查:

  1. 首先,確保你已經安裝在你的虛擬環境的權利引擎(您可以通過運行pip list輕鬆地檢查,以防萬一,讓我堅持認爲,圖書館需要安裝在virtual environment)。確保你沒有pymysql,但是到Python3的端口叫做mysqlclientpymysql只適用於Python2。爲了安裝這個庫,你需要首先安裝Python和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的版本:在虛擬環境中打開一個Python殼(中github從示例)鍵入以下可以通過運行pip list進行檢查),因爲在DEBUG模式下運行Flask時出現了一些錯誤,這些錯誤隨着時間的推移已經修復。

  4. 這裏肯定不是這樣,但另一個完整性檢查是驗證您想用於Flask的端口上沒有其他進程在運行。

如果以上所有工作正常,我需要看到一點的堆棧跟蹤找出什麼是真正回事。

+0

安東尼奧哈羅感謝您的建議。但它仍然給錯誤。 –

+0

事情是我需要從URL獲取數據庫名稱,我試圖得到這樣的數據庫楠數據庫= request.url.split(「/」)[2] .split(「。」)[0]它停止從這裏。 –