unicloud数据库表结构迁移必须通过schema文件驱动,修改后需右键同步云数据库,否则字段变更不生效;新增必填字段需清空或补全历史数据,类型不匹配会静默丢数据,权限未配置将导致查询返回空数组。

uniCloud数据库表结构迁移必须用 schema 文件
uniCloud 不支持像 MySQL 那样用 ALTER TABLE 修改字段,所有表结构变更必须通过 schema 文件驱动。你改了 xxx.schema.json,再「右键 → 同步云数据库」,它才会真正更新云端表结构(包括字段类型、索引、权限等)。
常见错误是:只改了本地 schema 文件,却没同步;或改了代码里 db.collection().add() 的字段,但 schema 里没声明,结果数据写入成功但字段不生效(比如没索引、没校验、前端查不到)。
- schema 文件名必须和集合名完全一致(如集合叫
user_info,文件就是user_info.schema.json) - 修改后必须在 HBuilderX 中右键该文件 → 「同步云数据库」,不能靠重新部署云函数或重启项目触发
- 如果已存在数据,新增必填字段(
"required": ["new_field"])会导致同步失败,需先清空或补全历史数据
迁移时字段类型不匹配会静默丢数据
比如微信云开发里存的是字符串 "123",uniCloud schema 中定义为 "int",同步后该字段值会变成 0 或直接被忽略——没有报错,但数据就没了。
典型场景:时间字段用 Date 类型,但旧数据是字符串格式 "2025-01-01";又或者布尔字段写成 "true" 字符串,schema 却设为 "bool"。
- 迁移前用
db.collection("xxx").get()抽样检查原始数据格式 - schema 中用
"bsonType": ["string", "int"]允许多类型过渡(上线后再逐步清洗) - 避免在生产环境直接改
"bsonType",建议新建集合 + 脚本迁移,再切流量
权限配置不同步 = 数据不可读
微信云开发默认所有字段可读,uniCloud 默认所有字段禁止读写,除非你在 schema 的 permission 里明确放开。哪怕表结构完全一样,没配权限也会导致前端 db.collection().get() 返回空数组且无报错。
最容易漏的是 "read" 权限——尤其带用户隔离的场景(如 "read": "auth == user.id"),写错表达式或拼写错误(比如把 user_id 写成 uid)就会彻底查不到数据。
- 权限字段必须写在
permission对象下,不是外层properties里 - 测试时用游客模式(未登录)和登录态分别调用
.get(),确认行为符合预期 - 线上环境禁用
"read": true,宁可先全关,再按需逐个放开
跨云厂商迁移要处理 _id 兼容性
阿里云生成的 24 位字符串 _id(如 "60a8b1c2d3e4f5a6b7c8d9e0")直接导入腾讯云会失效——腾讯云要求 ObjectId 或字符串长度严格匹配其内部解析规则,否则 db.collection().doc(id).get() 查不到。
官方 Web 控制台导出的 JSON 不做转换,而 uniCloud「数据库一键搬家」工具会在迁移时自动给 24 位 _id 补一位(如末尾加 "0"),确保跨平台可用。
- 手动迁移时,务必用
db.collection().add({ _id: ... })显式指定新_id,别依赖服务端自动生成 - 若保留原
_id,需在目标云环境用云函数批量重写,不能靠客户端操作 - 外键关联字段(如
user_id)也得同步处理,否则 join 查询会断链











