尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

n8n-workflows 的 FastAPI 服务遇到 SQLite 数据库被锁(database is locked)怎么处理?

n8n-workflows 的 FastAPI 服务遇到 SQLite 数据库被锁(database is locked)怎么处理? n8n-workflows 的 FastAPI 服务遇到 SQLite 数据库被锁database is locked怎么处理【免费下载链接】n8n-workflowsall of the workflows of n8n i could find (also from the site itself)项目地址: https://gitcode.com/GitHub_Trending/n8nworkflo/n8n-workflowsn8n-workflows 仓库里除了按服务分类的 workflow JSON 文件还内置了一个 FastAPI 搜索服务api_server.py它用 SQLite 数据库 database/workflows.db 存储 workflow 元数据并做 FTS5 全文检索。数据库路径由 run.py 固定在database/workflows.db同时写入环境变量WORKFLOW_DB_PATH也可以通过 DEPLOYMENT.md 环境变量表中的DATABASE_PATH默认database/workflows.db覆盖。服务正常对外提供http://localhost:8000/api/workflows、/api/stats等接口时如果你在接口返回 500、应用日志或启动输出里看到 SQLite 的database is locked错误本文按 DEPLOYMENT.md “Troubleshooting → Common Issues → Database locked error” 给出的排查路径来处理。运行前提来自 DEPLOYMENT.md 的 Python Direct Deployment 小节Python 3.11、pip先pip install -r requirements.txtrequirements.txt 包含 fastapi0.109.0、uvicorn[standard]0.27.0、gunicorn21.2.0 等启动命令为python run.py开发模式加--dev生产模式--host 0.0.0.0 --port 8000。先定位错误来源接口 500 还是启动失败服务对数据库错误的暴露方式在 api_server.py 中有明确定义可以据此判断错误发生在哪一层接口层/api/stats和/api/workflows的异常处理统一抛出500detail 形如Error fetching stats: {str(e)}/Error searching workflows: {str(e)}。当底层 SQLite 抛出database is locked时你会在响应 JSON 的 detail 字段里看到这段文字。启动层启动事件会执行db.get_stats()验证数据库连通性失败时打印❌ Database connection failed: {e}并 raise服务起不来成功时打印✅ Database connected: {total} workflows indexed。run.py 在启动服务器前会先建database、static、workflows目录并完成索引索引阶段的异常会打印❌ Database setup error: {e}并以退出码 1 结束。确认错误文字确实是database is locked之后进入下面的排查步骤。第一步检查数据库文件权限这是 DEPLOYMENT.md Troubleshooting 一节对 “Database locked error” 给出的官方排查命令# Check file permissions ls -la database/该命令只读取目录信息没有副作用。重点看workflows.db属主/属组、读写位以及目录本身是否可访问。由于 workflow_db.py 的init_database会对库执行PRAGMA journal_modeWAL数据库实际由主库文件加 WAL 附属文件共同构成ls -la database/的输出应能同时看到这些文件任何一项的权限异常都可能让打开或写入数据库失败。文档给出的修复命令是# Fix permissions chmod 664 database/workflows.db使用前提和副作用chmod直接修改文件权限位664 表示属主可读写、属组及其他用户只读。执行前先用上面的ls -la确认当前权限确实异常如果你以 root 以外的用户运行服务还要注意文件属主要和运行服务的用户匹配文档没有给出属主修改命令此点文档未覆盖。第二步验证修复结果修复后按 DEPLOYMENT.md “Health Checks” 一节的方式验证服务已恢复# Manual health check curl http://localhost:8000/api/stats返回的 JSON 中total、active、triggers等字段来自get_stats()的真实查询只要返回 200 和统计数据说明读路径已恢复。再看应用日志确认启动时打印的是✅ Database connected而不是❌ Database connection failed# View application logs docker compose logs -f workflows-docs如果服务以 Docker Compose 方式运行还可以按 DEPLOYMENT.md “Logs Debugging” 一节用 sqlite3 在容器内直接检查表是否可读# Database logs docker exec workflows-docs sqlite3 /app/database/workflows.db .tables注意容器内数据库路径是/app/database/workflows.db而 docker-compose.yml 中workflows-db卷挂载到/app/database宿主机上执行chmod时要先通过docker volume inspect找到卷对应的实际路径文档未展开这一步仅说明卷挂载关系。锁定持续时的可选路径重建索引如果你刚执行过python run.py --reindex或看到索引输出workflow_db.pyindex_all_workflows打印Indexing N workflow files...和✅ Indexing complete: ... processed, ... skipped, ... errors与请求同时发生索引的批量INSERT OR REPLACE写操作会长时间占用数据库。DEPLOYMENT.md 给出的重建命令是# Force reindex for better performance python run.py --reindex # Or via API curl -X POST http://localhost:8000/api/reindexpython run.py --reindex会强制重处理所有 workflow 文件索引期间同时启动服务会导致两个进程写同一个 SQLite 文件/api/reindex则是通过接口触发。执行重建前建议按 DEPLOYMENT.md “Database Backup” 一节先备份避免重建中断后数据不完整# Backup SQLite database cp database/workflows.db database/workflows.db.backup该命令只是复制出.backup副本不修改原库恢复时用cp database/workflows.db.backup database/workflows.db覆盖回原库这一步会替换数据库文件务必确认备份可用后再做且服务已停止。限制说明文档对 “Database locked error” 给出的排查手段只有“查权限 改权限”一条路径没有提供busy_timeout等锁等待参数配置也不断言权限修复能覆盖所有并发锁场景若权限正常但锁仍复现文档未给出进一步步骤可先确认是否存在重建索引与查询并发的情况再考虑 DEPLOYMENT.md “Multiple Instances / Scaling” 中多实例部署的说明该节只描述副本与负载均衡配置未讨论多实例共用一个 SQLite 文件的锁问题。run.py单进程模式下索引与服务串行执行生产多 worker 部署gunicorn -w 4 -k uvicorn.workers.UvicornWorker -b 0.0.0.0:8000 api_server:app时多个 worker 各自持有到同一个workflows.db的连接workflow_db.py 已为库设置了 WAL journal mode 与synchronousNORMAL但文档没有给出该配置与锁错误的对应结论以上仅为源码中可核对的事实。【免费下载链接】n8n-workflowsall of the workflows of n8n i could find (also from the site itself)项目地址: https://gitcode.com/GitHub_Trending/n8nworkflo/n8n-workflows创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表