Immich 数据库迁移全链路:从 generate 到 revert 的 5 个关键动作

发布时间:2026/9/9 15:04:17

Immich 数据库迁移全链路:从 generate 到 revert 的 5 个关键动作
Immich 数据库迁移全链路从 generate 到 revert 的 5 个关键动作【免费下载链接】OpenCore-Legacy-PatcherExperience macOS just like before项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher在 Immich 里做数据库迁移最容易翻车的场景不在单分支而在合并两个分支各自新增一个迁移文件合并后服务重启Postgres 报 DDL 错误进程直接挂掉。文件时间戳互不冲突字典序也排得整整齐齐但两个分支静默地以错误顺序合并了——后执行的 DDL 依赖的表根本还不存在。这个问题在合并前无法被肉眼发现因为目录里只有带时间戳的文件没有任何显式的顺序约定。答案是一份被 git 跟踪的 ORDER 清单server/src/schema/migrations/ORDER每个迁移文件名去掉 .ts 后缀后占清单一行新迁移必须显式登记进去。两个分支各自新增迁移时冲突会落在清单文件上强制开发者亲手决定先后顺序。这是用冲突噪音换顺序确定性的设计。sql-tools 在中间做了什么Immich 服务端的表结构全部用 TypeScript 声明位于 server/src/schema分三部分tables/声明式 API 描述的表定义约 64 个文件描述数据库应该长什么样、enums.ts 与 functions.ts枚举与数据库函数、migrations/按时间戳排序的迁移文件加 ORDER 清单。声明定义本身不动数据库真正执行变更的是迁移文件里的 up() 函数——把已有数据库改成目标形态的执行单元。两侧由 immich/sql-toolsImmich 自研的迁移工具链下文简称 sql-tools桥接它比对声明式 schema 与真实数据库的差异自动生成迁移 SQL再按 ORDER 清单顺序执行。一次真实迁移AddUserAvatarColorColumn给 users 表加列并把存量数据从 JSON 元数据回填到新列长这样export async function up(db: Kyselyany): Promisevoid { await sqlALTER TABLE users ADD avatarColor varchar;.execute(db); // 随后 UPDATE把存量数据从 user_metadata 的 JSON 回填到新列 } export async function down(db: Kyselyany): Promisevoid { await sqlALTER TABLE users DROP COLUMN avatarColor;.execute(db); }迁移文件统一命名为 毫秒时间戳-PascalCase 名称.ts从 1744910873969-InitialMigration 排到最新的业务迁移。时间戳前缀保证同目录内字典序即执行序——改动前缀等于篡改执行历史。另有一类 up/down 都是空操作的占位迁移文件它的存在只是为了维持 ORDER 清单与磁盘文件的一一对应审阅时不必纠结内容。服务启动流程本身就包含运行所有未应用的迁移开发环境重启 server 后新迁移会自动落到本地库无需手动 run。改 → 验 → 落 → 提交改声明先行generate 出差异 DDL先改 server/src/schema/tables 里的声明式定义再让 sql-tools 比对差异、生成迁移# 前置本地 Docker 已跑起 Postgres默认连接 localhost:5432/immich可用 DB_URL 覆盖 mise //server:migrations generate AddUserAvatarColorColumnmise 是仓库统一的开发任务运行器//server:前缀表示在 monorepo 根目录执行 server 包任务实际展开为 sql-tools -u 连接串 migrations generate。生成文件带时间戳前缀、落在 server 目录下还不算最终产物。验人眼过一遍 up 与 down整条链路里最容易踩坑的其实是这一步——机器生成的 DDL 只保证结构差异不保证业务正确。核对三件事DDL 是否符合预期列类型、默认值、索引down() 是否真的可安全回退加列好回退改类型丢数据数据回填逻辑有没有漏存量数据是否被搬进新结构。落移入 migrations 目录并在本地库应用把生成文件手动移入 server/src/schema/migrations——该目录当前有 97 个迁移文件命名全部是统一的时间戳格式——然后应用到本地库看结果# 前置迁移文件已移入 migrations/本地 Postgres 可达 mise //server:migrations run开发环境里也可以靠 server 重启自动应用run 是手动等价物。提交sync-order 与 verify-order 一起过先登记顺序再提交# 前置迁移文件已在 migrations/ 内且本地验证通过 mise //server:migrations sync-order # 把新迁移追加进 ORDER 清单 mise //server:migrations verify-order # 校验磁盘文件与清单完全一致迁移文件与 ORDER 必须同一提交进 git。漏掉 sync-orderverify-order 会在 CI 的 checklist 里被拦下来。出事了怎么办先定位再动手。schema-check 是服务内置命令实现见 server/src/commands/schema-check.ts它把每个迁移归为三态applied已应用正常路径deleted数据库里已应用磁盘上文件不见了missing磁盘上有还没应用到数据库。漂移指磁盘声明与数据库实际状态之间的偏离。检测到漂移时命令会列出漂移项并附一段自动生成的修复 SQL——源码标注 Use at your own risk!执行前必须人工确认。三个处置手段命令适用场景生产环境mise //server:migrations revert执行最新一条迁移的 down()验证回滚逻辑是否可逆⚠️ 禁止schema-check服务命令核对三态输出漂移清单与修复 SQL⚠️ 禁止schema-dropschema-resetserver/mise.toml 任务本地库与迁移历史脱节时DROP SCHEMA public CASCADE 后按 ORDER 重放全部迁移会清空数据⚠️ 禁止revert 适合验证 down 逻辑schema-reset 是清空后重放全部 97 个迁移本地状态彻底混乱手工改过表、误删过迁移文件时用它恢复最快。以上命令一律不要指向生产库生产环境的回滚应走备份恢复而不是迁移回退。速查以下命令都假设本地可达的 Postgreslocalhost:5432/immich 或 DB_URL//server:前缀表示在 monorepo 根目录执行。server 目录内也可用等价的 npm scriptsmigrations:generate 等见 server/package.json。命令作用mise //server:migrations create name创建空迁移骨架up/down 占位mise //server:migrations generate name比对声明式 schema 与数据库自动生成迁移 DDLmise //server:migrations run执行所有未应用的迁移mise //server:migrations revert回滚最近一次迁移执行其 downmise //server:migrations sync-order把新迁移登记进 ORDER 清单mise //server:migrations verify-order校验清单与磁盘文件一致CI checklist 会执行【免费下载链接】OpenCore-Legacy-PatcherExperience macOS just like before项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

杭州旧电脑回收上门服务|故障报废电脑免费上门估价结算

杭州旧电脑回收上门服务|故障报废电脑免费上门估价结算

2026/9/9 15:04:17

家里堆着开不了机的旧笔记本、碎屏的台式机、进水的一体机,扔了觉得可惜,想卖却处处碰壁:多数商家只收完好电脑,故障报废机直接拒收;好不容易找到收的,还要自己扛去数码城,跑腿费时间&#xff1…

5分钟跑通Selenium自动化测试实战指南

5分钟跑通Selenium自动化测试实战指南

2026/9/9 14:54:16

1. 这个“5分钟”不是营销话术,而是可复现的工程压缩结果 你点开这篇标题时,大概率心里在想:又一个标题党。自动化测试从零到跑通?别说5分钟,光搭环境、装驱动、配PATH,我上次就卡了47分钟——最后发现是C…

APP安全应急响应实战:从攻击识别到构筑长效免疫体系

APP安全应急响应实战:从攻击识别到构筑长效免疫体系

2026/9/9 14:54:16

凌晨两点,手机被值班同事的电话吵醒。APP登录接口的监控大屏飘红,用户反馈一批接一批涌进来:支付超时、页面白屏、刚登录的账号被强制退出。一开始还以为是发布新版本引发的兼容问题,结果一查Nginx日志,全是同一类畸形…

Windows 10/11 跑 Android 子系统:WSABuilds 从零到跑通的手把手安装手册

Windows 10/11 跑 Android 子系统:WSABuilds 从零到跑通的手把手安装手册

2026/9/9 15:54:19

Windows 10/11 跑 Android 子系统:WSABuilds 从零到跑通的手把手安装手册 【免费下载链接】WSABuilds Run Windows Subsystem For Android on your Windows 10 and Windows 11 PC using prebuilt binaries with Google Play Store (MindTheGapps) and/or Magisk or …

WSABuilds 30 分钟上手:在 Windows 上装一个带 Google Play 和 Root 的安卓环境

WSABuilds 30 分钟上手:在 Windows 上装一个带 Google Play 和 Root 的安卓环境

2026/9/9 15:54:19

WSABuilds 30 分钟上手:在 Windows 上装一个带 Google Play 和 Root 的安卓环境 【免费下载链接】WSABuilds Run Windows Subsystem For Android on your Windows 10 and Windows 11 PC using prebuilt binaries with Google Play Store (MindTheGapps) and/or Magi…

OpenCore Legacy Patcher 快速上手指南:3步让旧Mac跑起新版macOS

OpenCore Legacy Patcher 快速上手指南:3步让旧Mac跑起新版macOS

2026/9/9 15:54:19

OpenCore Legacy Patcher 快速上手指南:3步让旧Mac跑起新版macOS 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 2015年的 MacBook Pro 上&#x…

9款开源免费AI论文软件横评:毕业论文全流程工具推荐

9款开源免费AI论文软件横评:毕业论文全流程工具推荐

2026/9/9 15:54:19

又到了毕业论文的季节,后台几乎每天都能收到类似提问:有没有好用又不收费的AI论文软件?开源的工具到底能不能打?说实话,这两年我前后折腾过不下20款AI写作、文献检索和排版工具,踩过的坑能写满一页A4纸。这…

三维工厂设计中PLANT3D结构建模流程与避坑指南

三维工厂设计中PLANT3D结构建模流程与避坑指南

2026/9/9 15:54:19

在三维工厂设计项目里,最容易出现的一种返工是:管道布置都快完成一轮了,设备管嘴标高也对完了,结果结构模型一合进来,发现柱子正好穿过泵入口软管区域,或者管廊梁下净空少了200毫米,保温层根本过…

AI编程工具选型指南:破解‘opencode‘搜索迷雾

AI编程工具选型指南:破解‘opencode‘搜索迷雾

2026/9/9 15:44:19

1. “opencode”不是标准工具,而是开发者对开源编码能力的泛指概念 “opencode”这个词在当前技术社区里没有官方定义,既不是 npm 上注册的知名包,也不是 GitHub 上有明确组织归属的成熟项目。它不像 React、Vue 或 Next.js 那样拥有清晰的官…

中国人民大学杨琳团队《Nature Communications》 | 全球潮汐湿地土壤有机碳时空格局与环境驱动:一项2009-2020年的全球评估

中国人民大学杨琳团队《Nature Communications》 | 全球潮汐湿地土壤有机碳时空格局与环境驱动:一项2009-2020年的全球评估

2026/9/9 1:14:29

本文首发于“生态学者”!从“湿地面积”到“土壤碳密度”:为什么需要重新认识潮汐湿地蓝碳变化?潮汐湿地位于陆地与海洋的交汇地带,包括红树林、盐沼和潮滩,是全球重要的蓝碳生态系统。其土壤能够长期储存大量有机碳&a…

adb抓包

adb抓包

2026/9/8 4:55:53

前言 本文介绍如何通过 tcpdump 在 Android 手机上抓取网络数据包,并在电脑端使用 Wireshark 进行分析。适用于需要排查 App 网络请求、分析接口调用或调试网络问题的开发与测试场景。1. 手机要有 root 权限2. 下载 tcpdump3. adb push C:\Users\zhangkuixun\Downlo…

大模型推理镜像极简瘦身:从 25GB 巨无霸到 3GB 精简镜像实战

大模型推理镜像极简瘦身:从 25GB 巨无霸到 3GB 精简镜像实战

2026/9/8 22:37:26

大模型推理镜像极简瘦身:从 25GB 巨无霸到 3GB 精简镜像实战 在云原生基础设施中,容器镜像体积直接决定了服务的部署速度与弹性扩容敏捷度。对于传统的 Go / Java 微服务,镜像体积通常被严格控制在 50MB 到 200MB 以内,拉取镜像只…

扩散模型图像恢复实战:从DDPM原理到PyQt5可视化系统

扩散模型图像恢复实战:从DDPM原理到PyQt5可视化系统

2026/9/9 0:03:36

简介:面向毕业设计场景的PyQt5扩散模型图像恢复项目,提供完整Python源码与项目说明,适合图像处理、深度学习方向的高年级本科生与研究生参考。项目在模块设计上覆盖图像处理、扩散模型、参数配置、用户界面与结果评估五部分,具体涉…

开关电源环路裕量测试实战:相位裕量与增益裕量详解

开关电源环路裕量测试实战:相位裕量与增益裕量详解

2026/9/9 0:03:36

1. 项目概述:为什么环路裕量测试是电子工程师绕不开的“体检项目”“从零开始的电子工程师生活(6)——环路裕量测试”,这个标题一出来,老电源工程师可能已经下意识摸了摸示波器探头,新同事则大概率在想&…

定时插座芯片怎么选?专用定时IC与单片机MCU选型对比

定时插座芯片怎么选?专用定时IC与单片机MCU选型对比

2026/9/9 0:03:36

拆开市面上不同价位的定时插座,你会发现一个有意思的现象:有的里面躺着一颗黑色的软封装芯片,丝印都看不清;有的则是一块小小的蓝色或绿色PCB,上面赫然印着STM8或者STC的字样。同样叫"定时插座",…

远程协作的工作台整理

远程协作的工作台整理

2026/9/8 4:23:39

远程协作的工作台整理远程协作的核心不是再加一个工具,而是让交接信息足够完整。异步任务要写明目标、输入位置、完成标准和需要决策的人。 工作台的最小配置 将日程、待办、代码和沟通入口收拢到少数固定位置;通知按紧急程度分层。工作台不需要模仿办公…

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

2026/9/8 3:19:39

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

2026/9/8 4:00:23

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…