Flask项目SQLite Todo表不存在:手动创建后查询仍报错
问题
运行Flask代码并连接本地主机,向待办事项列表添加任务后,在终端执行sqlite3 database.db进入数据库,再执行select * from todo;时收到错误提示:no such table: todo(1)。已在代码中添加with app.app_context(): db.create_all()手动创建数据库和表,但问题依旧。
相关代码:
from flask import Flask, render_template, redirect, url_for from flask_sqlalchemy import SQLAlchemy from flask_wtf import FlaskForm from wtforms import StringField, SubmitField from wtforms.validators import InputRequired, Length app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///database.db' app.config['SECRET_KEY'] = ' 43235a0c23c2457e96417f2de3c292df ' db = SQLAlchemy(app) # Creating the Todo model class Todo(db.Model): id = db.Column(db.Integer, primary_key=True) todo = db.Column(db.String(50), nullable=False) # Initializing the database and creating the table if it doesn't exist with app.app_context(): db.create_all() # Initializing the TodoForm class TodoForm(FlaskForm): todo = StringField("Enter Todo", validators=[InputRequired(), Length(min=4, max=50)]) submit = SubmitField('Add Todo') @app.route('/', methods=['GET', "POST"]) def home(): form = TodoForm() if form.validate_on_submit(): new_todo = Todo(todo=form.todo.data) db.session.add(new_todo) db.session.commit() todos = Todo.query.all() return render_template("home.html", form=form, todos=todos) if __name__ == "__main__": app.run(debug=True)
解决方案
确认数据库文件路径:Flask默认在代码运行的当前目录生成
database.db。如果终端打开的目录和代码运行目录不一致,你访问的是另一个空数据库文件。先找到代码运行时生成的database.db所在路径,再切换到对应目录执行sqlite3 database.db。调整表创建代码的执行时机:把
db.create_all()移到主程序入口块内,确保仅在直接运行脚本时执行,避免上下文冲突:if __name__ == "__main__": with app.app_context(): db.create_all() app.run(debug=True)删除旧数据库文件重试:如果原有
database.db已损坏或表创建失败,直接删除该文件,重新运行代码让Flask重新生成完整的数据库和表结构。检查实际表名:Flask-SQLAlchemy默认将模型类名转为小写复数作为表名,即
todos而非todo。可以尝试执行select * from todos;查询,或者在模型类中显式指定表名:class Todo(db.Model): __tablename__ = 'todo' # 显式指定表名 id = db.Column(db.Integer, primary_key=True) todo = db.Column(db.String(50), nullable=False)
内容的提问来源于stack exchange,提问作者Westside
相关产品推荐
相关产品推荐

