动态数据库连接Flask-SQLAlchemy
我需要连接两个数据库。默认数据库是固定的,但另一个是动态的,它基于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
正如我在我的意见一说,这可能是与数据库的连接有问题。这是我想检查:
-
首先,确保你已经安装在你的虚拟环境的权利引擎(您可以通过运行
pip list
轻松地检查,以防万一,让我坚持认为,图书馆需要安装在virtual environment)。确保你没有pymysql
,但是到Python3的端口叫做mysqlclient。pymysql
只适用于Python2。为了安装这个库,你需要首先安装Python和MySQL开发头文件。例如,于Debian/Ubuntu:sudo apt-get install python-dev libmysqlclient-dev
然后你可以用下面的命令来安装库:
pip install mysqlclient
-
如果已安装,请确保您可以用实际连接到数据库图书馆。这一次你;
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
如果一切正常,请确保您运行的是最新瓶(0.12 at the moment的版本:在虚拟环境中打开一个Python壳(中github从示例)键入以下可以通过运行
pip list
进行检查),因为在DEBUG模式下运行Flask时出现了一些错误,这些错误随着时间的推移已经修复。这里肯定不是这样,但另一个完整性检查是验证您想用于Flask的端口上没有其他进程在运行。
如果以上所有工作正常,我需要看到一点的堆栈跟踪找出什么是真正回事。
安东尼奥哈罗感谢您的建议。但它仍然给错误。 –
事情是我需要从URL获取数据库名称,我试图得到这样的数据库楠数据库= request.url.split(“/”)[2] .split(“。”)[0]它停止从这里。 –
我认为当我开始我的应用程序它没有任何request.url因此可能是.. –
如果有上述问题,然后哪个.py文件最好连接数据库? –
尝试将'from .model import Users'放在模块的顶层。 – Fian