背景
最近重新开始写 Flask,发现很多知识点都已经忘记了,在链接数据库的过程当中也遇到很多问题,所以特地在此增加一个博客,用于记录使用 Flask 和 MySQL 数据库当中发生的所有错误信息,供大家进行参考。强烈建议使用 * VScode + Anaconda *的组合,可以实现环境的管理和不同环境之间的快速切换。
使用第三方库及版本
- Flask 1.1.2
- Flask-SQLAlchemy 2.5.1
- MySQL 5.56
- Python 3.5
问题汇总
数据库初始化后使用db.create_all()
报错,报错信息为:
flask_sqlalchemy\__init__.py", line 1043, in get_app
No application found. Either work inside a view function or push
RuntimeError: No application found. Either work inside a view function or push an application context. See http://flask-sqlalchemy.pocoo.org/contexts/.
迅速查看了自己的配置文件,该程序开发采用的时 exts.py
作为第三方文件,存储db类,并在manage.py
文件当中进行引用,文件详情如下:
exts.py
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
manage.py
from flask import Flask, render_template
from exts import db
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = r'mysql://root:password@localhost/mydb?charset=utf8mb4'
db.init_app(app)
解决方案
>>> from manage import db #导入db
>>> from manage import app #导入创建的app应用
>>> db.create_all(app=app) #将APP应用与db进行绑定
或
>>> from manage import app #导入创建的app应用
>>> from flask_sqlalchemy import SQLAlchemy #手动导入 SQLAlchemy
>>> db = SQLAlchemy(app) #绑定app
>>> db.create_all() #创建模型
使用flask-sqlalchemy 连接现有数据库
在开发中可能需要使用 sqlalchemy 直接连接已经创建好的数据库,在大部分教程中都有db.create_all() 用于创建新的数据库表,但事实上,若是连接已经有数据的数据库表,可以跳过这一步,只需要在模型中指定要连接的数据表即可。
class Project(db.Model):
"""
项目类,用于存储项目信息
"""
__tablename__ = 'project'
id = db.Column(db.Integer, primary_key=True)
project_name = db.Column(db.String(255))
customer = db.Column(db.String(50), nullable=False)
contact = db.Column(db.String(255), nullable=False)
details = db.Column(db.String(500), nullable=False)
deadline = db.Column(db.Date, nullable=False)
finish_date = db.Column(db.Date)
payment = db.Column(db.Integer)
progress = db.Column(db.Integer)
source = db.Column(db.Integer)
price = db.Column(db.String(100), nullable=False)
is_del = db.Column(db.Integer, nullable=False)
导入该模型后直接查询即可
>>> from xianyu.models.project import Project
>>> Project.query.all()
[<Project normal mark>, <Project 简简单单写个备注>, <Project normal mark>, <Project normal mark>, <Project normal mark>, <Project normal mark>]
可以在 flask 自带的 shell 中进行验证,启动 shell 的命令如下
# 格式:flask -A app所在的入口文件名:app名 shell
flask -A main:app shell
# 可以使用 flask --help 查看命令详情
-A, --app IMPORT The Flask application or factory function to load, in
the form 'module:name'. Module can be a dotted import
or file path. Name is not required if it is 'app',
'application', 'create_app', or 'make_app', and can be
'name(args)' to pass arguments.