Drizzle ORM 索引声明语法变更解析
2025-05-06 19:08:26作者:丁柯新Fawn
背景介绍
Drizzle ORM 是一个现代化的 TypeScript ORM 框架,近期在其 0.38.x 版本中引入了一个重要的语法变更,影响了索引声明的写法。这一变更虽然提升了代码的简洁性,但也导致了一些迁移过程中的困惑。
旧版索引声明方式
在 Drizzle ORM 的早期版本中,索引声明采用对象包装的形式:
export const logs = pgTable(
'logs',
{
id: serial('id').primaryKey().notNull(),
bookId: integer('book_id').references(() => books.id),
courseId: integer('course_id').references(() => courses.id),
metadata: text('metadata')
},
(table) => ({
courseIndex: index('idx_logs_course_id').on(table.courseId),
bookIndex: index('idx_logs_book_id').on(table.bookId)
})
);
这种方式需要为每个索引指定一个键名(如 courseIndex 和 bookIndex),虽然结构清晰但略显冗长。
新版索引声明语法
从 0.38.x 版本开始,Drizzle ORM 引入了更简洁的数组形式声明索引:
export const logs = pgTable(
'logs',
{
id: serial('id').primaryKey().notNull(),
bookId: integer('book_id').references(() => books.id),
courseId: integer('course_id').references(() => courses.id),
metadata: text('metadata')
},
(table) => [
index('idx_logs_course_id').on(table.courseId),
index('idx_logs_book_id').on(table.bookId)
]
);
主要变更点:
- 移除了索引的键名包装
- 直接返回索引定义的数组
- 每个索引定义都是独立的数组元素
迁移注意事项
- 语法兼容性:新语法从 0.38.x 版本开始支持,旧语法已被标记为废弃
- 迁移影响:直接替换语法会导致迁移脚本删除原有索引
- 最佳实践:建议先备份数据库,然后分两步执行:
- 创建新索引
- 再删除旧索引(如果需要)
技术原理
这种语法变更反映了 Drizzle ORM 向更函数式编程风格的演进。通过使用纯数组而非对象包装,框架可以:
- 更高效地处理索引定义
- 减少运行时对象创建的额外开销
- 简化类型系统的复杂度
- 为未来的扩展提供更灵活的基础
常见问题解决
如果在迁移过程中遇到索引被意外删除的情况,可以:
- 检查迁移脚本是否同时包含删除旧索引和创建新索引的操作
- 确保新语法正确使用了数组而非对象
- 验证索引名称是否保持一致
总结
Drizzle ORM 的索引声明语法变更是框架演进过程中的重要改进,虽然初期可能带来一些迁移成本,但从长远来看提供了更简洁、更高效的代码组织方式。开发者应当及时更新代码以适应这一变更,同时注意迁移过程中的数据安全。
登录后查看全文
热门项目推荐
相关项目推荐
GLM-5智谱 AI 正式发布 GLM-5,旨在应对复杂系统工程和长时域智能体任务。Jinja00
GLM-5-w4a8GLM-5-w4a8基于混合专家架构,专为复杂系统工程与长周期智能体任务设计。支持单/多节点部署,适配Atlas 800T A3,采用w4a8量化技术,结合vLLM推理优化,高效平衡性能与精度,助力智能应用开发Jinja00
jiuwenclawJiuwenClaw 是一款基于openJiuwen开发的智能AI Agent,它能够将大语言模型的强大能力,通过你日常使用的各类通讯应用,直接延伸至你的指尖。Python0220- QQwen3.5-397B-A17BQwen3.5 实现了重大飞跃,整合了多模态学习、架构效率、强化学习规模以及全球可访问性等方面的突破性进展,旨在为开发者和企业赋予前所未有的能力与效率。Jinja00
AtomGit城市坐标计划AtomGit 城市坐标计划开启!让开源有坐标,让城市有星火。致力于与城市合伙人共同构建并长期运营一个健康、活跃的本地开发者生态。01
AntSK基于.Net9 + AntBlazor + SemanticKernel 和KernelMemory 打造的AI知识库/智能体,支持本地离线AI大模型。可以不联网离线运行。支持aspire观测应用数据CSS01
项目优选
收起
deepin linux kernel
C
27
13
OpenHarmony documentation | OpenHarmony开发者文档
Dockerfile
626
4.12 K
Ascend Extension for PyTorch
Python
464
554
本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。
C++
930
801
🔥LeetCode solutions in any programming language | 多种编程语言实现 LeetCode、《剑指 Offer(第 2 版)》、《程序员面试金典(第 6 版)》题解
Java
69
21
AscendNPU-IR是基于MLIR(Multi-Level Intermediate Representation)构建的,面向昇腾亲和算子编译时使用的中间表示,提供昇腾完备表达能力,通过编译优化提升昇腾AI处理器计算效率,支持通过生态框架使能昇腾AI处理器与深度调优
C++
114
181
暂无简介
Dart
870
207
华为昇腾面向大规模分布式训练的多模态大模型套件,支撑多模态生成、多模态理解。
Python
130
189
openJiuwen agent-studio提供零码、低码可视化开发和工作流编排,模型、知识库、插件等各资源管理能力
TSX
1.43 K
378
昇腾LLM分布式训练框架
Python
136
160