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
相关产品推荐
相关产品推荐

