TSts-grm

模式创建与实体管理器

模型声明即 schema:sqlClient.createSchema() 从实体管理器汇总的模型直接产出建表/删表 DDL。本页在沙盒里真实演示:你编写的 models/ 文件 → EntityManager → DDL

工作机制

SqlClient 的模型由 EntityManager 提供——两种用法:

// 方式一:从目录加载编译后的模型模块(你自己的项目)
const em = EntityManager.of(__dirname, ['./dist/models/book.model.js'])

// 方式二:直接组合内存模型(脚本/测试场景)
const em = EntityManager.combine(Book, BookStore)

const client = newSqlClient(driver, { entityManager: em })

entities() 会收集模型及其关联目标Book.store 会把 BookStore 也带上)。

沙盒演示:看你的模型生成 DDL

示例工作区会在检测到 models/*.ts 时自动把它们加入 entityManager——所以你只需两步。

第一步:把模型写在工作区 models/book.model.ts(进入本页时已默认带好,可直接编辑):

// models/book.model.ts —— 会被自动收进 EntityManager
import { model, prop } from '@ts-grm/core'

export const BookStore = model("BookStore", "id", class {
    id = prop.i64()
    name = prop.str(100)
})

export const Book = model("Book", "id", class {
    id = prop.i64()
    name = prop.str(50)
    edition = prop.i32()
    price = prop.num(10, 2)
    store = prop.m2o(BookStore).nullable()
})

第二步:替换 main.ts 为下面脚本并运行:

// ① 模型来自工作区 models/book.model.ts(用户可编辑文件)
import { Book, BookStore } from './models/book.model'
import { sqlClient } from './infra/sql-client'

// ② createSchema():生成建表/删表脚本(不执行)
const schema = await sqlClient.createSchema()

console.log('=== 建表 DDL ===')
console.log(schema.creationSqlArray.join('\n\n'))

console.log('\n=== 删表 DDL(逆序) ===')
console.log(schema.deletionSqlArray.join('\n'))

运行后结果面板会打印完整 DDL——主键、外键(references ... on delete cascade)、多态 check 约束(如果模型有继承)、唯一约束(ctx.unique(...))都在里面,与上游测试结果一致。

也可以删掉 models/book.model.ts 里的模型再运行,看 DDL 如何跟着模型变化——这正是"声明即 schema"。

执行边界

  • createSchema()生成脚本,不碰数据库;schema.execute() 才会真实建表/删表——示例中不要执行它,要落库的话在你的项目里用;
  • Schema 对象可拿 creationSqlArray / deletionSqlArray / toString(),方便把 DDL 归档进迁移文件。

下一步

SQL 后端七页收束:驱动 → 命名 → 事务 → 方言 → 日志 → 模式创建 → 拦截器。后面的「API 参考」提供速查。