You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin Exposed 0.58版本如何自动更新数据库表结构?

解决方案

针对Exposed 0.58版本的表结构同步问题,分两种场景给出官方推荐的实现方式:

一、开发/快速迭代场景:自动同步表结构

替换原有的SchemaUtils.create()调用为SchemaUtils.createOrUpdate(),该方法会自动创建不存在的表,并为已存在的表新增缺失的列和索引(注意:不会删除列或修改现有列的类型/长度,避免数据丢失)。

代码示例:

// 替换之前的SchemaUtils.create(DBFactory.Items)
SchemaUtils.createOrUpdate(DBFactory.Items)

执行后,当表已存在时,会自动同步实体类中新增的列、索引等结构变更,无需手动编写SQL。

二、生产/多环境版本管理场景:版本化迁移

对于多环境表结构版本不一致的情况,官方推荐使用Exposed版本化迁移系统,通过定义有序的迁移脚本,启动时自动执行未应用的迁移,确保所有环境表结构统一。

1. 定义迁移类

每个迁移对应一个版本,继承Migration类实现结构变更逻辑,支持回滚操作(可选):

// 版本1:初始化表结构
class MigrationV1 : Migration() {
    override fun up() {
        SchemaUtils.create(Items)
    }

    override fun down() {
        SchemaUtils.drop(Items)
    }
}

// 版本2:新增name列及对应索引(示例变更)
class MigrationV2 : Migration() {
    override fun up() {
        Items.apply {
            val name = varchar("name", 100).nullable().default(null)
            addColumn(name)
            addIndex(index(name))
        }
    }

    override fun down() {
        Items.apply {
            dropColumn("name")
        }
    }
}

2. 启动时执行迁移

在应用初始化数据库的逻辑中,注册迁移并执行未完成的版本:

fun initDatabase() {
    val db = Database.connect(/* 你的数据库连接参数 */)
    val migrationManager = MigrationManager(db)
    
    // 按版本顺序添加迁移(必须严格按执行顺序排列)
    migrationManager.addMigrations(MigrationV1(), MigrationV2())
    
    // 自动执行所有未应用的迁移
    migrationManager.migrate()
}

关键特性

  • 迁移系统会自动维护一个exposed_migrations表,记录已执行的迁移版本,确保每个迁移仅执行一次。
  • 多环境启动时,会自动检测当前环境的迁移版本,执行后续所有未应用的脚本,无需手动干预。
  • 支持回滚操作,可通过调用migrationManager.rollback()回退到指定版本(生产环境需谨慎使用)。

内容的提问来源于stack exchange,提问作者BlackFlag

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 09:10:08