drizzle-orm-sqlite 0.14.1 迁移指南:独立 migrate 导入、drizzle() 工厂函数与驱动导入路径变更
drizzle-orm-sqlite 0.14.1 迁移指南独立 migrate 导入、drizzle() 工厂函数与驱动导入路径变更【免费下载链接】drizzle-ormORM项目地址: https://gitcode.com/gh_mirrors/dr/drizzle-orm导读drizzle-orm-sqlite 0.14.1 是一次以API 收敛为核心的版本更新对使用 better-sqlite3 的 SQLite 项目带来了三处直接影响日常写法的变更迁移功能被拆分为独立的子路径导入、初始化数据库的方式从显式构造SQLiteConnector改为统一的drizzle(client)工厂函数、驱动模块的导入路径随之调整。读完本文你将清楚知道旧代码需要如何迁移到新 API并理解这些变更在源码层的真实含义与背后设计动机。变更一迁移功能被拆分为独立导入0.14.1 将迁移migrations功能从主包路径中拆出需要从专门的子路径导入import { migrate } from drizzle-orm-sqlite/better-sqlite3/migrate;这一拆分的直接好处是不再使用迁移功能的项目可以避免加载迁移相关代码包括对fs、crypto等 Node 内置模块的依赖从而获得更小的打包体积也让主入口的职责更加单一。migrate 的签名与配置项在源码中migrate函数位于 drizzle-orm/src/better-sqlite3/migrator.ts其实现非常简洁export function migrateTSchema extends Recordstring, unknown( db: BetterSQLite3DatabaseTSchema, config: MigrationConfig, ) { const migrations readMigrationFiles(config); db.dialect.migrate(migrations, db.session, config); }它接收两个参数db通过drizzle(client)创建的BetterSQLite3Database实例configMigrationConfig定义在 drizzle-orm/src/migrator.tsexport interface MigrationConfig { migrationsFolder: string; migrationsTable?: string; migrationsSchema?: string; }配置项类型必填说明migrationsFolderstring是存放迁移文件的目录需包含meta/_journal.json与对应的.sql文件migrationsTablestring否记录已执行迁移的元数据表名默认__drizzle_migrationsmigrationsSchemastring否迁移元数据表所在的 schemaSQLite 场景通常不需要一个完整的调用示例import { drizzle } from drizzle-orm-sqlite/better-sqlite3; import { migrate } from drizzle-orm-sqlite/better-sqlite3/migrate; import Database from better-sqlite3; const sqlite new Database(sqlite.db); const db drizzle(sqlite); migrate(db, { migrationsFolder: drizzle });迁移执行的底层链路migrate内部先调用readMigrationFiles读取迁移文件drizzle-orm/src/migrator.ts。它会定位migrationsFolder/meta/_journal.json按 journal 中记录的entries顺序逐个读取对应.sql文件并以-- statement-breakpoint为分隔符将 SQL 拆分为语句数组同时记录每个迁移的时间戳folderMillis和基于 SHA-256 的内容哈希hash。随后由SQLiteSyncDialect.migrate执行drizzle-orm/src/sqlite-core/dialect.ts执行流程如下创建迁移元数据表默认__drizzle_migrations字段为id、hash、created_at查询最后一条已执行迁移的created_at在单个事务中BEGIN/COMMIT依次执行所有folderMillis大于已执行记录时间的迁移语句并将hash与时间戳写入元数据表任一语句失败则整体ROLLBACK并抛出异常。这也是为什么迁移文件必须按时间顺序生成、且不能随意改动已执行过的迁移内容——一旦哈希与记录不一致后续增量判断就会出错。变更二用drizzle(client)取代SQLiteConnector.connect()0.14.1 移除了旧的连接器写法// 旧写法0.14.1 起不再使用 const connector new SQLiteConnector(client); const db await connector.connect();取而代之的是统一的工厂函数import Database from better-sqlite3; import { drizzle } from drizzle-orm-sqlite/better-sqlite3; const client new Database(sqlite.db); const db drizzle(client);这一变更的价值在于所有方言/驱动的初始化入口被收敛为同一个drizzle()命名空间心智负担更低也便于未来统一扩展参数。从源码看drizzle函数drizzle-orm/src/better-sqlite3/driver.ts是一个支持多种调用形态的重载drizzle()——不传参数时内部自动new Client()创建一个内存数据库实例drizzle(client)——直接传入better-sqlite3的Database实例drizzle(connectionString)——传入文件路径字符串内部自行构造Clientdrizzle({ client })或drizzle({ connection: { source, ...options } })——以配置对象形式传入并可与schema、logger、casing等 Drizzle 配置合并。其内部会创建SQLiteSyncDialect、BetterSQLiteSession与BetterSQLite3Database三层结构并额外挂载$client属性以便直接访问底层驱动实例。例如同时开启日志const db drizzle(client, { logger: true });或直接传入配置对象并指定数据库文件const db drizzle({ connection: { source: sqlite.db }, logger: true, });对于测试场景还可以使用drizzle.mock()见 drizzle-orm/src/better-sqlite3/driver.ts构造一个不连接真实数据库的实例。变更三导入路径统一为驱动子路径0.14.1 同时统一了导入路径。旧代码中的import { SQLiteConnector } from drizzle-orm-sqlite;应替换为import { drizzle } from drizzle-orm-sqlite/better-sqlite3;需要说明的是原版更新日志中这一条写作import { drizzle } from drizzle-orm-pg/better-sqlite3结合上下文与当前仓库的目录结构drizzle-orm/src/better-sqlite3判断这应为drizzle-orm-sqlite/better-sqlite3的笔误——SQLite 的 better-sqlite3 驱动并不存在于drizzle-orm-pg包中实际代码应以drizzle-orm-sqlite/better-sqlite3为准。drizzle-orm-sqlite/better-sqlite3子路径导出driver.ts与session.ts两个模块见 drizzle-orm/src/better-sqlite3/index.ts其中driver.ts提供drizzle工厂函数与BetterSQLite3Database类型session.ts提供会话、事务与预编译查询的同步实现。若你的代码里显式引用了BetterSQLite3Database、BetterSQLiteSession等类型也应一并从该子路径导入。迁移清单速查将旧项目升级到 drizzle-orm-sqlite 0.14.1 及以上版本时可按下表逐项核对变更点旧写法新写法数据库初始化new SQLiteConnector(client).connect()drizzle(client)迁移功能导入从主包导入migrateimport { migrate } from drizzle-orm-sqlite/better-sqlite3/migrate驱动入口导入import { SQLiteConnector } from drizzle-orm-sqliteimport { drizzle } from drizzle-orm-sqlite/better-sqlite3升级后建议立即运行一次类型检查与一条真实的查询语句确认导入路径、迁移执行和查询结果均正常对存量数据库迁移元数据表默认__drizzle_migrations会被自动复用已执行的迁移不会被重复执行。小结drizzle-orm-sqlite 0.14.1 的三项变更是典型的API 规范化重构迁移模块独立成子路径、数据库初始化统一走drizzle()工厂函数、驱动导入路径按方言子目录收敛。它们不改变查询 API 的使用方式但显著改善了模块边界与导入语义。理解这些变更背后的源码结构migrator.ts的文件读取与事务执行、driver.ts的重载分发、dialect.ts的迁移元数据管理能让你在升级时更从容也能在后续排查迁移问题时更快定位到关键代码。【免费下载链接】drizzle-ormORM项目地址: https://gitcode.com/gh_mirrors/dr/drizzle-orm创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

告别分布式系统黑盒:PiggyMetrics Sleuth分布式追踪traceId/spanId日志与Zipkin实战

告别分布式系统黑盒:PiggyMetrics Sleuth分布式追踪traceId/spanId日志与Zipkin实战

告别分布式系统黑盒:PiggyMetrics Sleuth分布式追踪traceId/spanId日志与Zipkin实战 【免费下载链接】piggymetrics Microservice Architecture with Spring Boot, Spring Cloud and Docker 项目地址: https://gitcode.com/gh_mirrors/pi/piggymetrics 一、为…

2026/9/19 13:17:56 阅读更多 →
多平台电影院票务系统设计与实现:从架构到并发选座全解析

多平台电影院票务系统设计与实现:从架构到并发选座全解析

想起个事儿,我最近被问了好几次“电影院票务系统怎么做”,问的人里有做毕设的学生,也有准备接小影院外包项目的朋友。仔细聊下来发现,大家纠结的点其实很一致:不是不知道怎么写代码,而是不知道怎么把“小程…

2026/9/20 14:05:30 阅读更多 →
小功率半导体激光器驱动与温控电路设计:线性恒流源与TEC PID

小功率半导体激光器驱动与温控电路设计:线性恒流源与TEC PID

简介:半导体激光器对电流和温度变化极为敏感,微小的波动都会影响输出波长和功率稳定性,因此高可靠驱动与温控电路设计至关重要。该文档围绕基于FPGA的恒流驱动与恒温控制方案,系统介绍了负反馈积分、差分放大、线性慢启动、限流及…

2026/9/19 13:16:56 阅读更多 →

最新新闻

主动学习降低关系抽取标注成本的工程实践与代码解析

主动学习降低关系抽取标注成本的工程实践与代码解析

简介:面向关系抽取与主动学习方向的研究者,这份压缩包提供了一套基于BERT等模型的关系抽取实验方案,重点解决监督学习标注成本高、未标记样本利用率低的问题。包内共60个文件,涵盖26个Python脚本(如模型模块、训练器、…

2026/9/20 15:49:25 阅读更多 →
RapidOCR多引擎OCR:一套库离线跑遍CPU、GPU和移动端

RapidOCR多引擎OCR:一套库离线跑遍CPU、GPU和移动端

RapidOCR多引擎OCR:一套库离线跑遍CPU、GPU和移动端 【免费下载链接】RapidOCR 📄 Awesome OCR multiple programing languages toolkits based on ONNX Runtime, OpenVINO, MNN, PaddlePaddle, TensorRT and PyTorch. 项目地址: https://gitcode.com/…

2026/9/20 15:49:25 阅读更多 →
rome_markup 深入解析:为 Rome 控制台输出构建 JSX 风格标记的过程宏

rome_markup 深入解析:为 Rome 控制台输出构建 JSX 风格标记的过程宏

开发工具CLILint格式化静态分析代码质量构建工具 【免费下载链接】tools Unified developer tools for JavaScript, TypeScript, and the web 项目地址: https://gitcode.com/gh_mirrors/to/tools 点击查看 免费下载 rome_markup 是 Rome 工具链中一个专门的过程宏…

2026/9/20 15:49:25 阅读更多 →
温湿度传感器以太网通信中的CRC选型与实战避坑指南

温湿度传感器以太网通信中的CRC选型与实战避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/20 15:49:25 阅读更多 →
Ghidra逆向工程入门:环境配置、Java报错排查与反编译实战

Ghidra逆向工程入门:环境配置、Java报错排查与反编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/20 15:49:25 阅读更多 →
MacOS 上跑通 SQLite-Vec 向量检索:从报错到可用的完整路径

MacOS 上跑通 SQLite-Vec 向量检索:从报错到可用的完整路径

MacOS 上跑通 SQLite-Vec 向量检索:从报错到可用的完整路径 【免费下载链接】sqlite-vec A vector search SQLite extension that runs anywhere! 项目地址: https://gitcode.com/GitHub_Trending/sq/sqlite-vec 终端里敲完 .load,一行红字弹了出…

2026/9/20 15:48:24 阅读更多 →

日新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/20 0:00:46 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/20 0:00:46 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/20 0:00:46 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/20 0:00:46 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/20 0:00:46 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/20 0:00:46 阅读更多 →

月新闻

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

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

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

2026/9/19 23:01:36 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

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

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

2026/9/19 17:50:38 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/19 23:35:34 阅读更多 →