[bug]: On windows: After organizing outputs images in sub-folders, clearing intermediates becomes impossible

这个报错通常出现在 Windows 上用 InvokeAI 6.14.0rc1、并且执行过“Image Storage Maintenance”把输出图片整理进日期子文件夹之后;此时“Clear Intermediates”会因数据库外键约束拒绝删除图片而失败,优先排查数据库而非 Windows 权

快速结论:这个报错通常出现在 Windows 上用 InvokeAI 6.14.0rc1、并且执行过“Image Storage Maintenance”把输出图片整理进日期子文件夹之后;此时“Clear Intermediates”会因数据库外键约束拒绝删除图片而失败,优先排查数据库而非 Windows 权限。

适用环境:InvokeAI 6.14.0rc1(Launcher 安装,也有用户报告相关版本升级后出现)、Windows、Nvidia CUDA 11.8、GTX 970 4GB、Edge 浏览器。Issue 作者同时确认该问题并非 Windows 独有。

最快修复方案:Issue 中明确验证的首选方案是手工修复数据库:关闭 InvokeAI,备份 invokeai.db,在 databases 目录放入 fix_9504.sql,然后用虚拟环境 Python 执行该脚本重建 image_subfolder_move_items 表的外键。官方随后在 Invoke v7 中通过数据库迁移修复(invoke-ai/InvokeAI-7#34),升级到 v7 是最终的官方修复路径。

注意事项:手工改数据库有风险,务必先备份 invokeai.db;Issue 中说明这个修复脚本会保留已有移动记录,并且 v7 迁移能识别已修复的表、不会重复处理,之后再升级 v7 不受影响。所有按钮式修复(repair install、recover、reset webui)在评论中被确认无效。

问题场景

用户在 Windows 上用 InvokeAI 6.14.0rc1 生成图片,并通过 Invoke 的 Image Storage Maintenance 把输出图片迁移到日期命名的子文件夹中。迁移完成后继续生成,发现界面里无法再“Clear Intermediates”(清除中间图),中间图不断堆积;尝试 repair install、recover、reset webui 都无效。该问题在评论中被另一位用户确认,且即使开启 debug 模式也没有更多有效信息。

报错原文

[bug]: On windows: After organizing outputs images in sub-folders, clearing intermediates becomes impossible

Failed to delete image records

原因分析

Issue 维护者已定位根因:图片存储维护把图片移动到子文件夹时,会把每次移动记录写入数据库表 image_subfolder_move_items。该表对 images 表的外键没有 ON DELETE CASCADE,而且移动记录不会被清理。结果是数据库会拒绝删除任何曾被移动过的图片记录,于是“Clear Intermediates”报 Failed to delete image records,单独删除已移动的图片也会因同样原因失败。

评论还特别说明:debug 日志里的 fsync 相关行与本题无关,Windows 无法同步目录,这些提示是无害的,不要往文件系统权限或 Windows 特有行为方向排查。

环境排查

  • 确认 InvokeAI 版本是否为 6.14.0rc1(或升级后出现同类现象的相关版本)。
  • 确认是否执行过 Image Storage Maintenance,把图片迁移进日期子文件夹。
  • 确认安装方式为 Invoke Launcher,安装目录中包含 .venv
  • 确认 databases 目录位置,例如 C:\Users\<you>\invokeai\databases,并确认其中存在 invokeai.db
  • 环境信息中记录的操作系统为 Windows、GPU 为 Nvidia GTX 970 4GB、CUDA 11.8、浏览器 Edge;但该问题本身与 GPU、CUDA、浏览器无关。

解决步骤

  1. 完全关闭 InvokeAI,确保进程已退出。
  2. 备份 databases 目录下的 invokeai.db(例如 C:\Users\<you>\invokeai\databases\invokeai.db)。
  3. 把 Issue 提供的修复脚本保存为 fix_9504.sql,放在同一个 databases 目录下。脚本内容如下:
PRAGMA foreign_keys = ON;

BEGIN;

CREATE TABLE image_subfolder_move_items_new (
    job_id INTEGER NOT NULL REFERENCES image_subfolder_move_jobs(id),
    image_name TEXT NOT NULL REFERENCES images(image_name) ON DELETE CASCADE,
    old_subfolder TEXT NOT NULL,
    new_subfolder TEXT NOT NULL,
    is_intermediate BOOLEAN NOT NULL DEFAULT FALSE,
    old_path TEXT,
    new_path TEXT,
    old_thumbnail_path TEXT,
    new_thumbnail_path TEXT,
    state TEXT NOT NULL CHECK (
        state IN ('planned', 'moved', 'committed', 'error')
    ),
    error_message TEXT,
    PRIMARY KEY (job_id, image_name)
);

INSERT INTO image_subfolder_move_items_new (
    job_id, image_name, old_subfolder, new_subfolder, is_intermediate,
    old_path, new_path, old_thumbnail_path, new_thumbnail_path, state, error_message
)
SELECT
    items.job_id, items.image_name, items.old_subfolder, items.new_subfolder, items.is_intermediate,
    items.old_path, items.new_path, items.old_thumbnail_path, items.new_thumbnail_path,
    items.state, items.error_message
FROM image_subfolder_move_items AS items
JOIN images ON images.image_name = items.image_name
JOIN image_subfolder_move_jobs AS jobs ON jobs.id = items.job_id;

DROP TABLE image_subfolder_move_items;
ALTER TABLE image_subfolder_move_items_new RENAME TO image_subfolder_move_items;

CREATE INDEX IF NOT EXISTS idx_image_subfolder_move_items_job_state
ON image_subfolder_move_items(job_id, state);
CREATE INDEX IF NOT EXISTS idx_image_subfolder_move_items_image_name
ON image_subfolder_move_items(image_name);

COMMIT;
  1. 在 Invoke 安装目录(包含 .venv 的目录)打开终端,运行下面命令,并按实际情况调整 databases 路径:
.venv\Scripts\python -c "import sqlite3; p=r'C:\Users\<you>\invokeai\databases'; db=sqlite3.connect(p+r'\invokeai.db', isolation_level=None); db.executescript(open(p+r'\fix_9504.sql').read()); print('done')"
  1. 看到输出 done 后,重新启动 InvokeAI,再次执行 Clear Intermediates。
  2. 如仍使用 6.x 并希望彻底修复,官方修复在 Invoke v7 的数据库迁移中(invoke-ai/InvokeAI-7#34),升级到 v7 是推荐路径。

验证方法

重启 InvokeAI 后执行 Clear Intermediates,确认不再出现 Failed to delete image records,中间图确实被删除;也可以尝试单独删除一张曾被移动到子文件夹中的图片,确认删除不再被外键约束阻止。由于脚本保留了原有移动记录,之后再次移动图片也应正常工作,v7 迁移会识别已修复的表并跳过。

参考来源

invoke-ai/InvokeAI #9504

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 23383

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注