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

Flask SQLAlchemy重启后无法读取数据库条目,其他文件可正常读取

问题排查提示

1. 优先验证数据库文件路径一致性

这是最常见的原因:两个文件运行时的工作目录不同,导致连接到了不同的SQLite数据库文件。

在app.py和第二个文件中分别添加代码打印数据库文件的绝对路径,确认是否指向同一个文件:

  • 在app.py中添加:
    import os
    with app.app_context():
        print("App 连接的DB路径:", os.path.abspath('myDB.db'))
    
  • 在第二个文件中添加:
    import os
    print("第二个文件连接的DB路径:", os.path.abspath('myDB.db'))
    

如果路径不一致,说明运行app.py时的工作目录不是文件所在的文件夹。解决方法:

  • 将SQLALCHEMY_DATABASE_URI改为绝对路径,例如:sqlite:////Users/xxx/project/myDB.db(Windows系统用sqlite:///C:/xxx/project/myDB.db)
  • 调整VSCode的运行配置,确保工作目录为项目文件夹

2. 修正模型和DB实例的定义范围

当前app.py中db = SQLAlchemy(app)和Recipy类是在with app.app_context():块内定义的,可能导致上下文绑定异常。建议将DB实例和模型移到全局范围,仅在上下文内执行create_all():
修改后的app.py核心代码:

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///myDB.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.config["SQLALCHEMY_ECHO"] = "debug"

# 全局定义DB实例和模型
db = SQLAlchemy(app)

class Recipy(db.Model):
    id = db.Column(db.Integer, primary_key=True) 
    title = db.Column(db.String(100), index=True, unique=True) 
    # 其他字段...

# 在上下文内初始化表
with app.app_context():
    db.create_all()

@app.route('/')
def index():
    rows = Recipy.query.all()
    print(rows)
    return render_template("home.html", rows=rows, search_form=search_form)

3. 排除表结构或事务异常

  • 检查app.py中是否存在db.drop_all()代码(即使注释掉也可能残留执行记录),避免启动时意外清空表
  • 从日志看,两次查询后都执行了ROLLBACK,这是SQLAlchemy查询事务的默认行为,不会影响数据读取,无需关注

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 13:25:11