表操作
本章描述如何创建、删除、清空和同步数据库表。
请确保每个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) = task1. exists(tableName) 表是否存在
通过表名判断表是否存在
函数声明
fun exists(tableName: String): Boolean使用示例
val exists = wrapper.table.exists("user")接收参数
参数 说明 类型 默认值 * tableName表名 String-返回值
Boolean表是否存在
2. exists<T>(instance) 表是否存在
- 泛型参数:
<T>实体对象类型,继承自KPojo
通过KPojo判断表是否存在
函数声明
inline fun <reified T : KPojo> exists(instance: T = createKPojo<T>()): Boolean
📚Kronos 如何不使用反射构造,根据 KType 创建 KPojo?
使用示例
val exists = wrapper.table.exists(User()) // 或 val exists = wrapper.table.exists<User>()接收参数
参数 说明 类型 默认值 instance实体对象。泛型重载使用为 `T` 生成或注册的 factory。 TcreateKPojo() 返回值
Boolean- 表是否存在
3. createTable(instance) 创建表
- 泛型参数:
<T>实体对象类型,继承自KPojo
通过实体类创建表
函数声明
inline fun <reified T : KPojo> createTable(instance: T = createKPojo<T>())
📚Kronos 如何不使用反射构造,根据 KType 创建 KPojo?
使用示例
wrapper.table.createTable(User()) // 或 wrapper.table.createTable<User>()接收参数
参数 说明 类型 默认值 instance实体对象。泛型重载使用为 `T` 生成或注册的 factory。 TcreateKPojo()
4. createTable(target, query) CREATE TABLE AS SELECT
把目标 KPojo 和 KSelectable 或 UnionClause 来源查询传给 wrapper.table.createTable(target, query),可以用查询结果创建表。
函数声明
inline fun <reified T : KPojo> createTable( instance: T = createKPojo<T>(), query: KSelectable<*> ) inline fun <reified T : KPojo> createTable( instance: T = createKPojo<T>(), query: UnionClause<*> )使用示例
val paidOrders = Order() .select { [it.id, it.userId, it.status] } .where { it.status == 1 } wrapper.table.createTable(OrderArchive(), paidOrders)生成 SQL
CREATE TABLE IF NOT EXISTS `order_archive` AS SELECT `id`, `user_id` AS `userId`, `status` FROM `order` WHERE `order`.`status` = :status
CTAS 使用查询输出决定表形态。需要索引、注释、默认值、主键等 KPojo schema 元数据时,先使用普通 createTable(Target()) 建表,再使用 KSelectable.insert<Target>() 写入数据。
5. truncateTable(vararg tableName, restartIdentity) 清空表
通过表名清空一个或多个表。
函数声明
fun truncateTable(vararg tableName: String, restartIdentity: Boolean = true)使用示例
wrapper.table.truncateTable("user") wrapper.table.truncateTable("user", "audit_log", restartIdentity = false)接收参数
参数 说明 类型 默认值 * tableName表名列表 vararg String-restartIdentity是否重置自动递增值。PostgreSQL 和 SQLite 有明确的重置行为,其他方言保持各自原生 truncate 行为。 Booleantrue
6. truncateTable(instance, restartIdentity) 清空表
- 泛型参数:
<T>实体对象类型,继承自KPojo
通过实体类清空表
函数声明
inline fun <reified T : KPojo> truncateTable( instance: T = createKPojo<T>(), restartIdentity: Boolean = true )
📚Kronos 如何不使用反射构造,根据 KType 创建 KPojo?
使用示例
wrapper.table.truncateTable(User()) // 或 wrapper.table.truncateTable<User>()接收参数
参数 说明 类型 默认值 instance实体对象。泛型重载使用为 `T` 生成或注册的 factory。 TcreateKPojo() restartIdentity是否重置自动递增值。PostgreSQL 和 SQLite 有明确的重置行为,其他方言保持各自原生 truncate 行为。 Booleantrue
7. dropTable(vararg tableNames) 删除表
通过表名删除一个或多个表。
函数声明
fun dropTable(vararg tableNames: String)使用示例
wrapper.table.dropTable("user") wrapper.table.dropTable("user", "audit_log")接收参数
参数 说明 类型 默认值 * tableNames表名列表 vararg String-
8. dropTable(instance) 删除表
- 泛型参数:
<T>实体对象类型,继承自KPojo
通过实体类删除表
函数声明
inline fun <reified T : KPojo> dropTable(instance: T = createKPojo<T>())
📚Kronos 如何不使用反射构造,根据 KType 创建 KPojo?
使用示例
wrapper.table.dropTable(User()) // 或 wrapper.table.dropTable<User>()接收参数
参数 说明 类型 默认值 instance实体对象。泛型重载使用为 `T` 生成或注册的 factory。 TcreateKPojo()
9. syncTable(instance) 表结构同步和变更
- 泛型参数:
<T>实体对象类型,继承自KPojo
通过实体类同步表结构
函数声明
inline fun <reified T : KPojo> syncTable(instance: T = createKPojo<T>()): Boolean
📚Kronos 如何不使用反射构造,根据 KType 创建 KPojo?
使用示例
wrapper.table.syncTable(User()) // 或 wrapper.table.syncTable<User>()接收参数
参数 说明 类型 默认值 instance实体对象。泛型重载使用为 `T` 生成或注册的 factory。 TcreateKPojo() 返回值
Boolean-false表示 Kronos 创建目标表。true表示 Kronos 同步已有表。
对同一个实体对象连续执行多个表操作时,可以把对象保存在局部变量中,再传给
exists(instance)、createTable(instance)、dropTable(instance)或syncTable(instance)。