表操作

本章描述如何创建、删除、清空和同步数据库表。

请确保每个KPojo带有表操作所需的表名、列名、主键、索引和策略注解。

配置默认数据源后,可以通过Kronos.dataSource.table调用表操作;也可以通过某个具体的KronosDataSourceWrapper.table调用。 表结构同步和 CTAS 有独立说明:📚表结构同步 与 📚基于查询创建表。

构建 DDL statement 和预览 SQL

TableOperation 提供 build API 作为 dry-run 入口。需要语法对象时使用 statement builder;需要当前方言渲染后的 SQL 和参数时使用 task builder。

statement

val table = Kronos.dataSource.table

val createStatement = table.buildCreateTableStatement(User())
val dropStatement = table.buildDropTableStatement("user", ifExists = true)
val truncateStatement = table.buildTruncateTableStatement("user", restartIdentity = false)

task

val dropTask = table.buildDropTableTask("user")
val truncateTask = table.buildTruncateTableTask("user", restartIdentity = false)

val (sql, params, atomicTasks) = truncateTask

println(sql)
println(params)
println(atomicTasks.map { it.operationType })

SQLite output

DELETE FROM "user"
{}
[TRUNCATE, TRUNCATE, TRUNCATE]

CTAS 也可以先构建任务,再决定是否执行。

ctas task

val paidOrders = Order()
    .select { [it.id, it.userId, it.status] }
    .where { it.status == 1 }

val task = table.buildCreateTableAsSelectTask(OrderArchive(), paidOrders)
val (ctasSql, ctasParams) = task

1. exists(tableName) 表是否存在

通过表名判断表是否存在


2. exists<T>(instance) 表是否存在


通过KPojo判断表是否存在

📚Kronos 如何不使用反射构造,根据 KType 创建 KPojo?


3. createTable(instance) 创建表


通过实体类创建表

📚Kronos 如何不使用反射构造,根据 KType 创建 KPojo?


4. createTable(target, query) CREATE TABLE AS SELECT

把目标 KPojo 和 KSelectable 或 UnionClause 来源查询传给 wrapper.table.createTable(target, query),可以用查询结果创建表。

CTAS 使用查询输出决定表形态。需要索引、注释、默认值、主键等 KPojo schema 元数据时,先使用普通 createTable(Target()) 建表,再使用 KSelectable.insert<Target>() 写入数据。


5. truncateTable(vararg tableName, restartIdentity) 清空表

通过表名清空一个或多个表。


6. truncateTable(instance, restartIdentity) 清空表


通过实体类清空表

📚Kronos 如何不使用反射构造,根据 KType 创建 KPojo?


7. dropTable(vararg tableNames) 删除表

通过表名删除一个或多个表。


8. dropTable(instance) 删除表


通过实体类删除表

📚Kronos 如何不使用反射构造,根据 KType 创建 KPojo?


9. syncTable(instance) 表结构同步和变更

通过实体类同步表结构

📚Kronos 如何不使用反射构造,根据 KType 创建 KPojo?


对同一个实体对象连续执行多个表操作时,可以把对象保存在局部变量中,再传给exists(instance)、createTable(instance)、dropTable(instance)或syncTable(instance)。