Flask待办应用运行报sqlite3 no such table错误如何解决
错误原因
@app.before_first_request装饰的建表函数create_tables缩进错误,被嵌套在delete路由函数内部,不会被Flask框架加载执行,应用启动时不会自动创建数据库表。- 手动执行建表的
db.create_all()代码写在被注释的if __name__ == "__main__"代码块中,同样不会触发执行。
两项问题共同导致SQLite数据库中未生成todo表,访问应用查询数据时报表不存在错误。
解决方案
方案一:修正自动建表逻辑
调整app.py代码缩进,将create_tables函数移到全局作用域,确保装饰器生效:
# 原有delete路由函数保持不变 @app.route("/delete/<int:todo_id>") def delete(todo_id): todo = Todo.query.filter_by(id=todo_id).first() db.session.delete(todo) db.session.commit() return redirect(url_for("home")) # 以下代码移出delete函数,放在全局位置 @app.before_first_request def create_tables(): db.create_all()
修改完成后重新启动应用即可自动创建表。
方案二:手动建表
如果选择保留原有代码结构,可通过Flask shell手动执行建表操作:
- 终端进入项目虚拟环境,执行命令进入Flask shell:
flask shell
- 在shell交互界面执行以下代码完成建表:
from app import db, app with app.app_context(): db.create_all() exit()
- 重新执行
flask run启动应用即可正常访问。
注意事项
如果项目目录下已经生成了空的db.sqlite文件,建议先删除该文件再执行建表操作,避免残留文件导致异常。
内容的提问来源于stack exchange,提问作者Satwik Gardas
相关产品推荐
相关产品推荐

