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

Flask应用连接SQLite报错:sqlite3.OperationalError: no such table

Flask + SQLite 连接问题求助

我正在学习Flask完成新任务,尝试用SQLite实现数据库连接。已经创建了schema.sql、init_db.py、app.py及模板文件,运行init_db.py无报错,但启动Flask应用时出现sqlite3.OperationalError: no such table错误。同时我在Flask数据库连接和表单创建方面存在困惑,希望获得相关学习建议。


相关文件内容

schema.sql

DROP TABLE IF EXISTS posts;

CREATE TABLE posts (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    title TEXT NOT NULL,
    content TEXT NOT NULL
);

init_db.py

import sqlite3

connection = sqlite3.connect('database.db')


with open('schema.sql') as f:
    connection.executescript(f.read())

cur = connection.cursor()

cur.execute("INSERT INTO posts (title, content) VALUES (?, ?)",
            ('First Post', 'Content for the first post')
            )

cur.execute("INSERT INTO posts (title, content) VALUES (?, ?)",
            ('Second Post', 'Content for the second post')
            )

connection.commit()
connection.close()

app.py

from flask import Flask, render_template , request , redirect, url_for
import sqlite3

app = Flask(__name__)

def get_db_connection():
    conn = sqlite3.connect('database.db')
    conn.row_factory = sqlite3.Row
    return conn


@app.route('/db')
def index():
    conn = get_db_connection()
    posts = conn.execute('SELECT * FROM posts').fetchall()
    conn.close()
    return render_template('index.html', posts=posts)

模板文件(index.html)

{% extends "base.html" %}
{% block title %}
    db Page
{% endblock %}
{% block content %}
    <h1>{% block title %} Posts {% endblock %}</h1>
    {% for post in posts %}
        <div class='post'>
            <p>{{ post['created'] }}</p>
            <h2>{{ post['title'] }}</h2>
            <p>{{ post['content'] }}</p>
        </div>
    {% endfor %}
{% endblock %}

问题排查建议

  • 检查database.db路径:Flask启动时会从当前终端所在目录查找数据库文件,而你运行init_db.py的目录可能和启动Flask的目录不一致,导致两个操作生成的数据库文件不在同一位置。建议给数据库文件指定绝对路径,比如sqlite3.connect('/your/project/path/database.db'),确保两个脚本指向同一个数据库。
  • 手动验证数据库:用SQLite命令行工具打开database.db,执行.tables命令查看是否存在posts表,确认init_db.py确实成功创建了表和插入数据。
  • 确认Flask实例路径:在app.py中添加print(app.instance_path),查看Flask默认的实例目录,若需要将数据库放在此目录下,需调整连接路径为sqlite3.connect(app.instance_path + '/database.db')。

学习建议

  • 数据库连接:优先使用Flask-SQLAlchemy扩展,它封装了SQLAlchemy ORM,简化了数据库连接、查询、事务管理等操作,比直接用原生sqlite3更适合Flask项目。
  • 表单处理:使用Flask-WTF扩展,它基于WTForms实现了表单验证、CSRF防护等核心功能,能大幅减少手动处理表单的代码量。
  • 官方资源:Flask官方文档包含数据库集成、表单处理的详细教程,是最权威的学习资料。
  • 项目实践:从简单的博客、待办清单等小型项目入手,逐步实践数据库操作和表单功能,通过实际代码加深理解。

内容的提问来源于stack exchange,提问作者Yassine Krout

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 12:03:29