db-migrations by lobehub/lobehub
npx skills add https://github.com/lobehub/lobehub --skill db-migrationsbun run db:generate
此命令会生成:
packages/database/migrations/0046_meaningless_file_name.sql并更新:
packages/database/migrations/meta/_journal.jsonpackages/database/src/core/migrations.jsondocs/development/database-schema.dbml对于不涉及 Drizzle 模式变更的迁移(例如启用 PostgreSQL 扩展),请使用 --custom 标志:
bunx drizzle-kit generate --custom --name=enable_pg_search
广告位招租
在这里展示您的产品或服务
触达数万 AI 开发者,精准高效
这将生成一个空的 SQL 文件,并正确更新 _journal.json 和快照。然后编辑生成的 SQL 文件以添加你的自定义 SQL:
-- Custom SQL migration file, put your code below! --
CREATE EXTENSION IF NOT EXISTS pg_search;
请勿手动创建迁移文件或编辑 _journal.json — 始终使用 drizzle-kit generate 以确保日志条目和快照正确无误。
将自动生成的文件名重命名为有意义的名称:
0046_meaningless_file_name.sql → 0046_user_add_avatar_column.sql
始终使用防御性子句使迁移具有幂等性(可安全地重新运行):
-- ✅ 正确
CREATE TABLE IF NOT EXISTS "agent_eval_runs" (
"id" text PRIMARY KEY NOT NULL,
"name" text,
"created_at" timestamp with time zone DEFAULT now() NOT NULL
);
-- ❌ 错误
CREATE TABLE "agent_eval_runs" (...);
-- ✅ 正确
ALTER TABLE "users" ADD COLUMN IF NOT EXISTS "avatar" text;
ALTER TABLE "posts" DROP COLUMN IF EXISTS "deprecated_field";
-- ❌ 错误
ALTER TABLE "users" ADD COLUMN "avatar" text;
PostgreSQL 没有 ADD CONSTRAINT IF NOT EXISTS。使用 DROP IF EXISTS + ADD:
-- ✅ 正确:先删除,再添加(幂等)
ALTER TABLE "agent_eval_datasets" DROP CONSTRAINT IF EXISTS "agent_eval_datasets_user_id_users_id_fk";
ALTER TABLE "agent_eval_datasets" ADD CONSTRAINT "agent_eval_datasets_user_id_users_id_fk"
FOREIGN KEY ("user_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action;
-- ❌ 错误:如果约束已存在,将会失败
ALTER TABLE "agent_eval_datasets" ADD CONSTRAINT "agent_eval_datasets_user_id_users_id_fk"
FOREIGN KEY ("user_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action;
-- ✅ 正确
DROP TABLE IF EXISTS "old_table";
CREATE INDEX IF NOT EXISTS "users_email_idx" ON "users" ("email");
CREATE UNIQUE INDEX IF NOT EXISTS "users_email_unique" ON "users" USING btree ("email");
-- ❌ 错误
DROP TABLE "old_table";
CREATE INDEX "users_email_idx" ON "users" ("email");
在步骤 2 中重命名迁移 SQL 文件后,更新 packages/database/migrations/meta/_journal.json 中的 tag 字段,使其与新的文件名(不含 .sql 扩展名)匹配。
每周安装量
78
代码仓库
GitHub 星标数
74.2K
首次出现
2026年3月3日
安全审计
安装于
kimi-cli78
gemini-cli78
amp78
cline78
github-copilot78
codex78
bun run db:generate
This generates:
packages/database/migrations/0046_meaningless_file_name.sqlAnd updates:
packages/database/migrations/meta/_journal.jsonpackages/database/src/core/migrations.jsondocs/development/database-schema.dbmlFor migrations that don't involve Drizzle schema changes (e.g. enabling PostgreSQL extensions), use the --custom flag:
bunx drizzle-kit generate --custom --name=enable_pg_search
This generates an empty SQL file and properly updates _journal.json and snapshot. Then edit the generated SQL file to add your custom SQL:
-- Custom SQL migration file, put your code below! --
CREATE EXTENSION IF NOT EXISTS pg_search;
Do NOT manually create migration files or edit_journal.json — always use drizzle-kit generate to ensure correct journal entries and snapshots.
Rename auto-generated filename to be meaningful:
0046_meaningless_file_name.sql → 0046_user_add_avatar_column.sql
Always use defensive clauses to make migrations idempotent (safe to re-run):
-- ✅ Good
CREATE TABLE IF NOT EXISTS "agent_eval_runs" (
"id" text PRIMARY KEY NOT NULL,
"name" text,
"created_at" timestamp with time zone DEFAULT now() NOT NULL
);
-- ❌ Bad
CREATE TABLE "agent_eval_runs" (...);
-- ✅ Good
ALTER TABLE "users" ADD COLUMN IF NOT EXISTS "avatar" text;
ALTER TABLE "posts" DROP COLUMN IF EXISTS "deprecated_field";
-- ❌ Bad
ALTER TABLE "users" ADD COLUMN "avatar" text;
PostgreSQL has no ADD CONSTRAINT IF NOT EXISTS. Use DROP IF EXISTS + ADD:
-- ✅ Good: Drop first, then add (idempotent)
ALTER TABLE "agent_eval_datasets" DROP CONSTRAINT IF EXISTS "agent_eval_datasets_user_id_users_id_fk";
ALTER TABLE "agent_eval_datasets" ADD CONSTRAINT "agent_eval_datasets_user_id_users_id_fk"
FOREIGN KEY ("user_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action;
-- ❌ Bad: Will fail if constraint already exists
ALTER TABLE "agent_eval_datasets" ADD CONSTRAINT "agent_eval_datasets_user_id_users_id_fk"
FOREIGN KEY ("user_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action;
-- ✅ Good
DROP TABLE IF EXISTS "old_table";
CREATE INDEX IF NOT EXISTS "users_email_idx" ON "users" ("email");
CREATE UNIQUE INDEX IF NOT EXISTS "users_email_unique" ON "users" USING btree ("email");
-- ❌ Bad
DROP TABLE "old_table";
CREATE INDEX "users_email_idx" ON "users" ("email");
After renaming the migration SQL file in Step 2, update the tag field in packages/database/migrations/meta/_journal.json to match the new filename (without .sql extension).
Weekly Installs
78
Repository
GitHub Stars
74.2K
First Seen
Mar 3, 2026
Security Audits
Gen Agent Trust HubPassSocketPassSnykPass
Installed on
kimi-cli78
gemini-cli78
amp78
cline78
github-copilot78
codex78
Azure 升级评估与自动化工具 - 轻松迁移 Functions 计划、托管层级和 SKU
104,900 周安装