2017-06-03 24 views
8

tôi cần kết nối hai cơ sở dữ liệu. cơ sở dữ liệu mặc định là cố định nhưng cơ sở dữ liệu khác là động, dựa trên URL.Kết nối cơ sở dữ liệu động Flask-SQLAlchemy

ví dụ nếu url là: yourapp.myweb.com sau đó tên cơ sở dữ liệu thứ hai sẽ yourapp

tôi cố gắng kết nối cơ sở dữ liệu vào init py nhưng nó chỉ cho tôi lỗi sau

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. 

ở đây là tôi 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 

đây là 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." 

đây là 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

tôi nghĩ khi tôi khởi động ứng dụng, nó không có bất kỳ yêu cầu nào. Vì vậy, có thể là .. –

+0

nếu có vấn đề ở trên thì tệp .py nào là tốt nhất để kết nối cơ sở dữ liệu? –

+0

Thử đặt 'từ .model import Users' ở cấp cao nhất của mô-đun. – Fian

Trả lời

4

Như tôi đã nói trong một trong những ý kiến ​​của tôi, điều này có thể là một vấn đề với các kết nối cơ sở dữ liệu. Đây là những gì tôi muốn kiểm tra:

  1. Trước hết, hãy chắc chắn bạn có động cơ phải được cài đặt trong môi trường ảo của bạn (bạn có thể kiểm tra dễ dàng bằng cách chạy pip list; chỉ trong trường hợp, hãy để tôi nhấn mạnh rằng các thư viện cần được cài đặt trong virtual environment). Đảm bảo bạn không có pymysql, nhưng cổng đến Python3, được gọi là mysqlclient. pymysql chỉ hoạt động với Python2. Để cài đặt thư viện này, bạn cần cài đặt trước các tiêu đề phát triển Python và MySQL. Ví dụ, trong Debian/Ubuntu:

    sudo apt-get install python-dev libmysqlclient-dev 
    

    Sau đó, bạn có thể cài đặt thư viện với lệnh sau đây:

    pip install mysqlclient 
    
  2. Nếu đây được cài đặt, chắc chắn rằng bạn thực sự có thể kết nối với cơ sở dữ liệu bằng cách sử dụng thư viện. Mở vỏ Python trong môi trường ảo và gõ như sau (từ ví dụ trong github):

    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. Nếu làm việc này, hãy chắc chắn rằng bạn đang chạy phiên bản mới nhất của Flask (0.12 at the moment, điều này một lần nữa bạn có thể kiểm tra bằng cách chạy pip list), vì có một số lỗi liên quan đến việc chạy Flask ở chế độ DEBUG đã được sửa theo thời gian.

  4. Chắc chắn không phải như vậy ở đây, nhưng kiểm tra sanity khác đang xác minh rằng không có quy trình nào khác đang chạy trên cổng mà bạn muốn sử dụng cho Flask.

Nếu tất cả các điều trên đều hoạt động tốt, tôi cần xem một chút dấu vết ngăn xếp để tìm hiểu điều gì đang thực sự xảy ra.

+0

Antonio Haro cảm ơn đề xuất của bạn. nhưng nó vẫn đưa ra lỗi. –

+0

điều là tôi cần lấy tên cơ sở dữ liệu từ url và tôi cố gắng lấy cơ sở dữ liệu nane như cơ sở dữ liệu này = request.url.split ("/") [2] .split (".") [0] nó dừng lại ở đây . –

Các vấn đề liên quan