feat(db): 支持 MySQL 迁移(修复模型外键冲突 + 大文本类型 + 迁移工具) #13

Merged
kevin merged 4 commits from dsh/mailgo:fix/mysql-migration into main 2026-08-19 23:49:06 +08:00
Contributor

内容

  1. 修复模型外键冲突:Attachment.Message 关联的 foreignKey 名 MessageIDMessage.MessageID(RFC Message-ID 字符串字段)冲突,GORM AutoMigrate 会生成错误外键(messages.message_id → attachments.id 且强转 bigint),MySQL 下建表直接失败(SQLite 因动态类型侥幸可用)。已移除该未使用的关联。
  2. TEXT 上限text_body/html_bodymediumtext——MySQL TEXT 仅 64KB,大 HTML 邮件写入会失败。
  3. 新增 cmd/migrate 迁移工具:SQLite → MySQL 一次性迁移。GORM 模型读源、批量写目标;时间统一 UTC;ban_entries 零值时间转 NULL;mailbox_states 用原生 SQL(不依赖 MailboxState 模型,目标库缺表自动建表);逐表行数校验。

验证

  • 生产环境已完成 SQLite → MySQL 迁移:8 张表全部校验通过(messages 175、users 4、ban_entries 575 等)
  • MySQL 模式下 IMAP/Web/SMTP 投递全部正常,UIDVALIDITY 保留一致(客户端不重同步)
## 内容 1. **修复模型外键冲突**:Attachment.Message 关联的 foreignKey 名 `MessageID` 与 `Message.MessageID`(RFC Message-ID 字符串字段)冲突,GORM AutoMigrate 会生成错误外键(messages.message_id → attachments.id 且强转 bigint),MySQL 下建表直接失败(SQLite 因动态类型侥幸可用)。已移除该未使用的关联。 2. **TEXT 上限**:`text_body`/`html_body` 改 `mediumtext`——MySQL TEXT 仅 64KB,大 HTML 邮件写入会失败。 3. **新增 cmd/migrate 迁移工具**:SQLite → MySQL 一次性迁移。GORM 模型读源、批量写目标;时间统一 UTC;ban_entries 零值时间转 NULL;mailbox_states 用原生 SQL(不依赖 MailboxState 模型,目标库缺表自动建表);逐表行数校验。 ## 验证 - 生产环境已完成 SQLite → MySQL 迁移:8 张表全部校验通过(messages 175、users 4、ban_entries 575 等) - MySQL 模式下 IMAP/Web/SMTP 投递全部正常,UIDVALIDITY 保留一致(客户端不重同步)
dsh added 4 commits 2026-08-19 23:27:40 +08:00
- Attachment 模型移除 Message 关联:其 foreignKey 名 MessageID 与
  Message.MessageID 字符串字段冲突,GORM AutoMigrate 会生成错误外键
  (messages.message_id → attachments.id 且强转 bigint),MySQL 下建表
  直接失败(SQLite 因动态类型侥幸可用)
- Message.TextBody/HtmlBody 改 mediumtext:MySQL TEXT 仅 64KB,
  大 HTML 邮件会写入失败
- 新增 cmd/migrate:SQLite → MySQL 一次性迁移工具(GORM 模型读源、
  批量写目标、时间统一 UTC、ban_entries 零值时间转 NULL、逐表校验)
kevin merged commit f533fc8feb into main 2026-08-19 23:49:06 +08:00
Sign in to join this conversation.
No Reviewers
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: kevin/mailgo#13