fondo
Recientemente comencé a escribir Flask nuevamente y descubrí que se habían olvidado muchos puntos de conocimiento, y también encontré muchos problemas en el proceso de conexión a la base de datos, por lo que agregué especialmente un blog aquí para registrar todos los mensajes de error que ocurrieron en el uso de Bases de datos Flask y MySQL Para su referencia. Se recomienda encarecidamente utilizar la combinación de * VScode + Anaconda *, que puede realizar la gestión del entorno y el cambio rápido entre diferentes entornos.
Usar bibliotecas y versiones de terceros
- Matraz 1.1.2
- Matraz-SQLAlchemy 2.5.1
- mysql 5.56
- Pitón 3.5
Resumen del problema
Después de inicializar la base de datos db.create_all()
, se informa un error. El mensaje de error es:
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/.
Revisé rápidamente mi archivo de configuración. Cuando se desarrolló el programa, se usó exts.py
como un archivo de terceros para almacenar la clase db y manage.py
hacer referencia a ella en el archivo. Los detalles del archivo son los siguientes:
exts.py
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
gestionar.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)
solución
>>> 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() #创建模型
Use matraz-sqlalchemy para conectarse a una base de datos existente
En desarrollo, es posible que necesite usar sqlalchemy para conectarse directamente a la base de datos creada. En la mayoría de los tutoriales, db.create_all() se usa para crear una nueva tabla de base de datos, pero de hecho, si se conecta a una tabla de base de datos que ya tiene datos , puede omitir Después de este paso, solo necesita especificar la tabla de datos que se conectará en el modelo.
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)
Después de importar el modelo, puede consultar directamente
>>> 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>]
Se puede verificar en el caparazón que viene con el matraz.El comando para iniciar el caparazón es el siguiente
# 格式: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.