关于 drizzle-sqlite
面向使用 SQLite 系后端的 Drizzle ORM 开发者,提供模式、迁移、查询和应用类型参考。45 条规则涵盖多个驱动及 SQLite 特有行为。
主要功能
- 01八类共 45 条规则
- 02模式与迁移指导
- 03查询与关系模式
- 04事务与批处理建议
- 05驱动配置与类型推断
适用场景
- 01设计 SQLite 模式与索引
- 02规划 Drizzle 迁移
- 03改进查询性能
- 04配置事务与驱动连接
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ pproenca/ dot-skills --skill drizzle-sqlite安装后在 Claude Code 中输入/drizzle-sqlite确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
AGENTS.mdmetadata.jsonassets/templates/_template.mdreferences/_sections.mdconn-enable-wal.mdconn-foreign-keys-pragma.mdconn-pick-driver-deliberately.mdconn-set-busy-timeout.mdconn-singleton-client.mdmigrate-apply-with-migrator.mdmigrate-commit-migrations-to-git.mdmigrate-config-dialect-and-out.mdmigrate-data-backfill-as-custom-sql.mdmigrate-explicit-renames.mdmigrate-generate-not-push-in-prod.mdperf-avoid-count-star-on-large-tables.mdperf-bulk-insert-multi-row-values.mdperf-covering-index-for-hot-queries.mdperf-keyset-not-offset-for-deep-pages.mdperf-prepare-hot-paths.mdquery-always-limit-listings.mdquery-avoid-n-plus-one-with-inarray.mdquery-bind-parameters-not-concat.mdquery-returning-instead-of-reselect.mdquery-select-columns-not-star.mdquery-toSQL-and-explain.mdquery-upsert-with-onconflict.mdrel-declare-relations-for-rqb.mdrel-filter-with-where-inside-with.mdrel-leftjoin-for-flat-aggregates.md详细介绍
dot-skills Drizzle SQLite 最佳实践
面向 Drizzle ORM 与 SQLite 系列后端的库参考技能。包含 8 个类别中的 45 条规则,按执行生命周期的影响排序:架构 → 迁移 → 查询 → 关系 → 事务 → 性能 → 连接 → 类型。
适用时机
在以下情况参考这些指南:
- 定义
sqliteTable架构——选择列类型、主键、索引和外键 - 运行
drizzle-kit generate/migrate/push,或手动编辑迁移 SQL 文件 - 使用
db.select()、db.insert()、db.update()、db.delete()编写查询 - 使用
db.query.*和关系查询构建器获取嵌套数据 - 使用
db.transaction()或db.batch()(libsql/Turso/D1)封装多语句写入 - 使用
.prepare()+sql.placeholder()或覆盖索引优化热路径查询 - 设置 Drizzle 客户端(pragmas、驱动选择、单例生命周期)
- 将数据库类型接入应用代码(
$inferSelect、drizzle-zod、JSON 结构)
此技能并非针对某个特定驱动——它涵盖 better-sqlite3、libsql、bun:sqlite、expo-sqlite、op-sqlite 和 Cloudflare D1 共通的行为,并在存在差异时指出特定驱动的区别。
架构背景
SQLite 在生产数据库中颇为特殊:
- 没有客户端/服务端。“连接”就是打开一个文件。在本地文件场景中,没有连接池、身份验证或网络。
- **只有一个写入者。**无论有多少连接,同一时间都只能有一个写入者。启用 WAL 后可以并行读取。
- **没有原生布尔值或日期。**所有内容都是
INTEGER、REAL、TEXT、BLOB或NULL——其余类型由 Drizzle 列模式编码。 - **
ALTER TABLE功能有限。**仅支持RENAME COLUMN、ADD COLUMN、DROP COLUMN。更改类型和添加约束都需要重建表。 - 默认关闭外键。
PRAGMA foreign_keys = ON按连接设置,且不会持久保存。
此技能中的许多规则之所以存在,是因为 Drizzle 的 API 对 PostgreSQL/MySQL/SQLite 做了统一抽象——但底层 SQLite 引擎有其限制,如果像使用 Postgres 一样对待它,这些限制会在运行时显现。
按优先级排列的规则类别
| 优先级 | 类别 | 影响 | 前缀 |
|---|---|---|---|
| 1 | 架构定义 | 严重 | schema- |
| 2 | 迁移与 Drizzle Kit | 严重 | migrate- |
| 3 | 查询构建 | 高 | query- |
| 4 | 关系 | 高 | rel- |
| 5 | 事务与批处理 | 中高 | tx- |
| 6 | 预处理语句与热路径 | 中高 | perf- |
| 7 | 连接与驱动设置 | 中 | conn- |
| 8 | 类型推断 | 中 | types- |
快速参考
1. 架构定义(严重)
schema-integer-for-booleans— 使用integer({ mode: 'boolean' }),使推断类型为boolean,而不是0 | 1schema-timestamp-mode-for-dates— 将日期存储为integer({ mode: 'timestamp_ms' }),而不是文本schema-always-primary-key— 显式声明主键(单列或复合);不要依赖隐藏的 rowidschema-foreign-keys-with-actions— 为每个.references()指定onDelete/onUpdateschema-index-foreign-keys-and-lookups— 为外键列和频繁用于WHERE的列建索引——SQLite 不会自动为外键建索引schema-text-json-not-blob-json— 使用text({ mode: 'json' }),以便json_extract和 JSON 路径索引正常工作schema-unique-constraints-for-natural-keys— 为 email/slug/externalId 使用.unique(),以便 onConflict 有可用的目标
2. 迁移与 Drizzle Kit(关键)
migrate-generate-not-push-in-prod— 使用generate + migrate;push会删除无法协调的列migrate-explicit-renames— 回答重命名提示;默认会将重命名视为先删除再新增migrate-config-dialect-and-out— 定义drizzle.config.ts,让命令无需标志参数即可运行migrate-apply-with-migrator— 使用drizzle-kit migrate或驱动的migrator模块应用迁移,而非原始 SQLmigrate-data-backfill-as-custom-sql— 手动编辑迁移 SQL,与 DDL 一起原子性地回填数据migrate-commit-migrations-to-git— 将drizzle/SQL 和drizzle/meta/快照提交到 Git;两者缺一不可
3. 查询构建(高优先级)
query-select-columns-not-star— 使用db.select({ ... })仅选择所需的列query-avoid-n-plus-one-with-inarray— 用inArray()替代循环查询query-always-limit-listings— 每个列表查询都需要.limit()(最好还使用游标)query-bind-parameters-not-concat— 使用eq()/ sql 模板,绝不要拼接字符串值query-upsert-with-onconflict— 使用.onConflictDoUpdate()原子性地执行插入或更新,而非先查询再写入query-returning-instead-of-reselect— 在插入、更新或删除时使用.returning(),可省去一次往返query-toSQL-and-explain— 检查生成的 SQL,并在热点路径上使用EXPLAIN QUERY PLAN
4. 关系(高优先级)
rel-declare-relations-for-rqb— 声明relations()可启用db.query.*和withrel-prefer-with-over-manual-joins— 嵌套获取使用with;手动联接会失去类型信息并增加代码量rel-partial-columns-in-with— 在with中使用columns: { ... },以限制载荷并避免数据泄露rel-filter-with-where-inside-with— 将关联行筛选条件放入with.where,而非 JSrel-leftjoin-for-flat-aggregates— 需要聚合时,改用leftJoin+groupBy
5. 事务与批处理(中高优先级)
tx-wrap-multi-statement-writes— 将相关写入封装在db.transaction()中,以保证原子性并提升吞吐量tx-batch-for-libsql-roundtrips— 在 libsql/Turso/D1 上使用db.batch(),将 N 次往返合并为 1 次tx-no-network-io-inside-transaction— 不要在事务中等待 HTTP / FS / Stripe 调用tx-handle-busy-with-retry— 对SQLITE_BUSY进行有次数上限的重试;仅针对暂时性错误tx-single-writer-no-parallel-writes— 使用Promise.all并行写入会产生争用;应串行执行
6. 预编译语句与热点路径(中高)
perf-prepare-hot-paths— 对每次请求都会运行的查询使用.prepare()+sql.placeholder()perf-bulk-insert-multi-row-values— 使用一次values([...rows]),而不是在循环中执行 N 次插入perf-avoid-count-star-on-large-tables— 使用计数器行或键集分页,而不是count(*)perf-keyset-not-offset-for-deep-pages— 键集分页可让各页的开销保持恒定perf-covering-index-for-hot-queries— 覆盖投影列,让查询规划器跳过读取行
7. 连接与驱动设置(中)
conn-enable-wal— 设置journal_mode = WAL,支持并发读取和单写入者conn-set-busy-timeout— 设置busy_timeout = 5000,让锁竞争转为等待conn-foreign-keys-pragma— 按连接设置foreign_keys = ON;默认关闭conn-singleton-client— 在模块作用域创建单例;绝不为每个请求单独构建conn-pick-driver-deliberately— 同步、异步还是 HTTP——根据部署目标选择
8. 类型推断(中)
types-infer-select-insert— 使用$inferSelect/$inferInsert推导行类型types-narrow-json-with-dollartype— 使用.$type<Shape>(),避免 JSON 列类型为unknowntypes-getTableColumns-for-reuse— 使用getTableColumns()+ 展开语法共享投影types-drizzle-zod-for-runtime-validation—createInsertSchema(table)可根据架构推导 Zod 验证器types-bigint-mode-for-large-integers— 对大于Number.MAX_SAFE_INTEGER的 ID 使用mode: 'bigint'
使用方法
先阅读 references/_sections.md 中相关类别的概览,再阅读具体规则文件,了解详细说明和代码示例。每条规则都包含错误与正确示例——请在审查的代码中应用正确模式。
对于复杂更改(架构重新设计、迁移策略、性能优化),请先阅读受影响类别中的所有规则,再作决定。
参考文件
| 文件 | 说明 |
|---|---|
| references/_sections.md | 类别定义和顺序 |
| assets/templates/_template.md | 新规则模板 |
| metadata.json | 版本和参考信息 |
相关技能
effect-ts— 当应用基于 Effect 时使用;Drizzle 通过Effect.tryPromise集成。nextjs-bundle-optimizer— 适用于将 SQLite 用作数据层的 Next.js 应用。better-auth— 常与 Drizzle SQLite 搭配用于身份验证表;有关表生成,请参阅better-auth-scaffold。
评论
支持 Markdown