关于 database-table-creator
此 Skill 面向遵循 PostgreSQL 与 Exposed ORM 约定的 Kotlin 项目开发者,用于生成数据库表实现。它按迁移、代码到测试的顺序提供流程,并明确软删除与架构规则。
主要功能
- 01生成 PostgreSQL 迁移
- 02生成 Kotlin 表与实体
- 03实现 CRUD 仓库
- 04注册 Factory bean
- 05生成仓库测试
适用场景
- 01为 Kotlin 服务添加数据表
- 02创建软删除 CRUD 仓库
- 03生成迁移与仓库测试
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ c0x12c/ ai-toolkit --skill database-table-creator安装后在 Claude Code 中输入/database-table-creator确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
examples.mdkotlin-templates.mdmigration-template.sqlvalidation-checklist.md详细介绍
数据库表创建技能
创建完整的数据库表实现,包括 SQL 迁移、Kotlin 代码和全面的测试。
此技能的功能
生成:
- SQL 迁移 — 包含软删除、索引和触发器的 PostgreSQL 表
- Kotlin 表对象 — Exposed ORM 表定义(继承
UUIDTable) - 实体数据类 — 实现
Entity<Instant>的 Kotlin 实体 - Repository 接口 + 实现 — 支持软删除的 CRUD 操作
- Repository 测试 — 全面的测试覆盖(7 项以上测试)
- Factory Bean — 依赖注入注册
关键规则
数据库设计(rules/database/SCHEMA.md)
SQL 要求:
- ❌ 不得使用外键约束(绝不可使用
REFERENCES或FOREIGN KEY) - ✅ 字符串使用
TEXT(不要使用VARCHAR) - ✅ 包含:id(UUID)、created_at、updated_at、deleted_at
- ✅ 所有索引都必须带有
WHERE deleted_at IS NULL - ✅ 添加软删除索引:
WHERE deleted_at IS NOT NULL - ✅ 为 updated_at 添加更新触发器
Kotlin 要求:
- ✅ 表必须继承
UUIDTable(不要继承Table) - ✅ 实体必须实现
Entity<Instant> - ✅ 所有查询都必须使用
deletedAt.isNull()进行筛选 - ❌ 禁止使用
!!运算符(提交前钩子会禁止) - ✅ 只使用软删除(设置 deletedAt,绝不硬删除)
工作流
步骤 1:创建 SQL 迁移
位置:database-migration/sql/{number}-{description}.sql
-- ============================================================================
-- Description: [Describe what this migration does]
-- Table: {table_name}
-- ============================================================================
CREATE TABLE {table_name} (
-- Primary key (REQUIRED)
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
-- Business columns
name TEXT NOT NULL,
email TEXT,
status TEXT DEFAULT 'active',
user_id UUID,
count INTEGER DEFAULT 0,
is_active BOOLEAN DEFAULT true,
metadata JSONB,
-- Standard timestamps (REQUIRED)
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP,
deleted_at TIMESTAMP
);
-- Unique index (allows duplicate soft-deleted records)
CREATE UNIQUE INDEX idx_{table_name}_email_unique
ON {table_name}(email) WHERE deleted_at IS NULL;
-- Foreign key index (NO FK constraint, just index)
CREATE INDEX idx_{table_name}_user_id
ON {table_name}(user_id) WHERE deleted_at IS NULL;
-- Soft delete index (REQUIRED)
CREATE INDEX idx_{table_name}_deleted_at
ON {table_name}(deleted_at) WHERE deleted_at IS NOT NULL;
-- Update trigger (REQUIRED)
CREATE TRIGGER update_{table_name}_updated_at
BEFORE UPDATE ON {table_name}
FOR EACH ROW
EXECUTE FUNCTION update_updated_at();
关键事项:
- 使用
TEXT,不要使用VARCHAR - 不得使用
REFERENCES或FOREIGN KEY - 所有索引都要带有
WHERE子句 - 必须添加软删除索引
- 必须添加更新触发器
步骤 2:运行迁移
./gradlew :app:module-repository:flywayMigrate
确认成功后再继续。
步骤 3–10:Kotlin 实现
所有 Kotlin 代码模板(Table、Entity、Repository、Factory Bean、测试)请参阅
kotlin-templates.md。
按以下顺序执行:
- 步骤 3 — 表对象(继承
UUIDTable,使用text(),不要使用varchar()) - 步骤 4 — 实体数据类(实现
Entity<Instant>) - 步骤 5 — 常量/枚举(如需要)
- 步骤 6 — Repository 接口
- 步骤 7 — Repository 实现(写入使用
db.primary,读取使用db.replica,始终使用deletedAt.isNull()进行筛选) - 步骤 8 — 注册 Factory Bean
- 步骤 9 — Repository 测试(至少 7 项测试,必须包含软删除验证)
- 步骤 10 — 运行测试:
./gradlew test
应避免的常见错误
常见错误和反模式请参阅
examples.md。
成功标准
✅ SQL 迁移成功运行
✅ 使用 TEXT(而非 VARCHAR)
✅ 不使用外键约束
✅ 所有索引都带有 WHERE 子句
✅ Kotlin 表继承 UUIDTable
✅ 实体实现 Entity<Instant>
✅ 所有查询都使用 deletedAt.isNull() 进行筛选
✅ 不使用 !! 运算符
✅ 仅使用软删除(不进行硬删除)
✅ 已注册 Factory Bean
✅ 7 项以上测试全部通过
评论
支持 Markdown