Flask与Mysql数据库连接各类问题汇总

背景

最近重新开始写 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.

猜你喜欢

转载自blog.csdn.net/qq_20728575/article/details/116193067
今日推荐