You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 19:03:21