ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

drizzle-kit 0.26.1 版本解读:修复视图快照的 `data is malformed` 校验错误

drizzle-kit 0.26.1 版本解读:修复视图快照的 `data is malformed` 校验错误 drizzle-kit 0.26.1 版本解读修复视图快照的data is malformed校验错误【免费下载链接】drizzle-ormORM项目地址: https://gitcode.com/gh_mirrors/dr/drizzle-ormdrizzle-kit 0.26.1 是紧随 0.26.0drizzle-kit 正式引入views管理与 PostgreSQL 枚举行为升级之后的补丁版本其核心变更只有一项修复视图view相关迁移/校验流程中出现的data is malformed错误。本文以该修复为切入点结合仓库源码梳理这一报错在 drizzle-kit 内部的产生机制、它为何与视图功能强相关以及遇到该错误时应该如何升级、排查与规避帮助你在使用drizzle-kit generate、drizzle-kit push、drizzle-kit check等命令时快速定位问题。0.26.1 修复了什么一句话变更的完整背景changelogs/drizzle-kit/0.26.1.md的完整变更内容为Fixdata is malformedfor views仅凭这一行很难理解修复的分量因此需要回到它的上一版本 0.26.0。在 0.26.0 变更日志 中drizzle-kit 首次完整引入了Views support开发者可以在 drizzle-orm 的 schema 定义中使用pgView、pgMaterializedViewPostgreSQL 专属物化视图以及各方言对应的视图 API并由 drizzle-kit 负责将这些视图对象序列化为迁移文件、写入snapshot.json从而纳入generate/push的全流程管理。例如 0.26.0 中展示的 PostgreSQL 示例import { sql } from drizzle-orm; import { pgTable, pgView, pgMaterializedView } from drizzle-orm/pg-core; export const users pgTable(users, (c) ({ id: c.uuid().defaultRandom().primaryKey(), username: c.text().notNull(), age: c.integer(), })); export const simpleView pgView(simple_users_view).as((qb) qb.select().from(users) ); export const materializedView pgMaterializedView( materialized_users_view ).as((qb) qb.select().from(users));对应的生成 SQL 为CREATE VIEW public.simple_users_view AS (select id, username, age from users); CREATE MATERIALIZED VIEW public.materialized_users_view AS (select id, username, age from users);视图被纳入快照snapshot体系是 0.26.1 修复的直接背景一旦视图信息进入snapshot.json所有读取并校验快照的命令generate、push、check、up等都必须能正确解析新增的视图字段而 0.26.0 刚落地该能力时部分场景下对视图快照的解析失败就会以data is malformed的形式暴露出来这正是 0.26.1 要修复的对象。data is malformed从哪来源码中的校验链路要理解该修复需要先弄清data is malformed这条报错在 drizzle-kit 内部的确切来源。搜索仓库可以发现该错误字符串只出现在两个位置drizzle-kit/src/utils.ts的prepareMigrationFolder函数中utils.tsdrizzle-kit/src/cli/commands/check.ts的checkHandler中check.ts。两者都消费同一个底层校验函数validateWithReport定义于 utils.ts其职责是逐个读取drizzle输出目录下的snapshot.json并按方言选择对应的 Zod schema 校验器做safeParseconst { validator, version } validatorForDialect(dialect); const result snapshots.reduce((accum, it) { const raw JSON.parse(readFileSync(./${it}).toString()); // ... const result validator.safeParse(raw); if (!result.success) { accum.malformed.push(it); return accum; } // ... }, { malformed: [], nonLatest: [], idsMap: {}, ... });当某个snapshot.json无法通过校验器解析时它就被记入malformed数组随后在prepareMigrationFolder/checkHandler中被输出为路径/snapshot.json data is malformed并导致流程中止process.exit。也就是说data is malformed的本质是“快照 JSON 结构与当前 drizzle-kit 版本期望的 schema 不匹配”常见触发原因包括快照由更新/更旧的 drizzle-kit 版本生成字段结构发生了变化例如 0.26.0 在快照中新增了views字段而旧版校验器不认识快照中的视图字段views内容缺失、类型错误或缺少必填属性快照文件本身被手动修改或损坏。为什么修复与“视图”强相关快照 schema 中的视图字段data is malformed的报错虽然历史悠久在validateWithReport中一直存在但 0.26.1 专门为其打上 “for views” 的标签说明问题集中在视图快照的解析上。从各方言的 serializer schema 可以看出视图字段正是在 0.26.0 前后被正式加入快照定义的PostgreSQLpgSchema.ts 中views: record(string(), view)SQLitesqliteSchema.ts 中views: record(string(), view)MySQLmysqlSchema.ts 中views: record(string(), view)GelgelSchema.ts 中views: record(string(), view)。以 Gel/PostgreSQL 系的视图快照结构为例gelSchema.ts每个视图对象包含export const view object({ name: string(), schema: string(), columns: record(string(), column), definition: string().optional(), materialized: boolean(), with: mergedViewWithOption.optional(), isExisting: boolean(), withNoData: boolean().optional(), using: string().optional(), tablespace: string().optional(), }).strict();注意这里使用了.strict()Zod 的 strict 模式会拒绝对象中出现未声明字段。从源码结构可以推断0.26.0 视图功能上线初期部分方言或部分 drizzle-orm 版本组合生成的快照在views对象中包含了校验器尚未声明的字段、或缺少materialized、isExisting等必填项导致safeParse失败进而触发data is malformed。0.26.1 的修复即在快照校验侧对齐这些视图字段使视图快照能够被正确解析。同时0.26.2 变更日志 也提醒用户0.26.x 内部同时更新了 drizzle-kit 与 drizzle-orm 的版本约定两个包需要同步升级才能正常工作。遇到data is malformed怎么办操作建议结合源码中的校验逻辑与官方变更说明遇到该报错时可按以下顺序排查同步升级 drizzle-kit 与 drizzle-orm 到 0.26.1首选。0.26.1 正是针对视图快照校验的修复版本同时参考 0.26.2 变更日志 的提示drizzle-kit 与 drizzle-orm 应升级到相互匹配的版本避免因快照结构版本不一致重新触发data is malformed。检查快照版本号。validateWithReport的源码显示校验分为三步先检查快照version是否高于当前 drizzle-kit 支持的上限此时提示snapshot is of unsupported version, please update drizzle-kit再用对应方言校验器做结构校验最后检查version是否为最新否则提示is not of the latest version, please run drizzle-kit up。如果报错是版本落后按提示运行drizzle-kit up升级快照即可。检查snapshot.json中的views字段。找到drizzle输出目录下的快照文件确认其中views对象内的每个视图是否包含完整的name、schema、columns、materialized、isExisting等字段且没有多余的自定义键因为校验器是.strict()。若快照由其他工具或人工编辑过恢复原始快照或重新生成。视图变更走generate而非仅靠push。结合 0.26.0 变更日志 中的说明generate对视图的所有变更都能正确处理而push对视图 SQL 定义变更有局限如果只修改了视图的 SQL 定义需要手动注释掉该视图 →push→ 恢复新定义 → 再次push。遵循这一工作流也能减少快照状态不一致带来的校验失败。版本定位与总结适用版本drizzle-kit 0.26.1配合 drizzle-orm 0.26.x 同步使用针对 PostgreSQL、MySQL、SQLite、Gel 等方言的视图管理功能。修复性质补丁级修复无新增功能、无破坏性变更其余 0.26.0 引入的能力Checks 支持、PostgreSQL 枚举增删值/跨 schema 移动/重命名等保持不变。核心价值data is malformed是 drizzle-kit 快照校验失败的统一出口0.26.1 消除了视图纳入快照体系后导致的误报让views能稳定地被generate、push、check、up等命令识别与处理。如果你正在使用 0.26.0 并遇到了data is malformed升级到 0.26.1 并保持 drizzle-orm 版本同步是最直接的解法如果问题依旧则按上文第 2、3 步检查快照文件本身的结构与版本状态即可。【免费下载链接】drizzle-ormORM项目地址: https://gitcode.com/gh_mirrors/dr/drizzle-orm创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表