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

如何从Exposed ORM创建的表生成SQL迁移脚本用于Flyway执行?

Exposed ORM 生成Flyway SQL迁移脚本方案

目前有两种成熟的方案可以满足你的需求,均完美适配Kotlin + JDK 16的技术栈:

1. 直接使用Exposed内置API生成

Exposed核心库本身提供了不连接数据库就输出DDL语句的能力,无需引入额外依赖:

  • 全量初始化脚本生成
    调用SchemaUtils.createStatements()方法,传入你定义的所有表对象,就能直接输出对应建表、建索引、加约束的原生SQL:
    import org.jetbrains.exposed.sql.SchemaUtils
    import org.jetbrains.exposed.sql.Table
    
    // 你的业务表定义示例
    object Orders : Table() {
        val orderId = long("order_id").autoIncrement()
        val userId = long("user_id")
        val amount = decimal("amount", 10, 2)
        override val primaryKey = PrimaryKey(orderId)
    }
    
    fun generateInitSql() {
        // 直接生成SQL,不需要建立数据库连接
        val ddlList = SchemaUtils.createStatements(Orders)
        val initSql = ddlList.joinToString("\n;\n")
        // 输出的内容直接写入Flyway的V1__init_base_tables.sql文件即可
        println(initSql)
    }
    
  • 增量修改脚本生成
    如果你是在原有表基础上做字段、索引修改,可以调用SchemaUtils.addMissingColumnsStatements()、SchemaUtils.createMissingTablesAndColumns()方法,设置execute参数为false,就能拿到增量变更的SQL语句,不用手动编写ALTER语句。

2. 使用Exposed官方Gradle迁移插件

Exposed团队提供了官方的exposed-migration-plugin Gradle插件,可以自动集成到项目构建流程中:

  • 插件会自动比对你当前代码中的Exposed表结构和连接的测试库/生产库的实际表结构,自动生成符合Flyway命名规范的增量迁移脚本
  • 生成的脚本默认输出到Flyway默认的src/main/resources/db/migration目录,无需手动移动文件
  • 插件完全兼容JDK 16及更高版本的运行环境

注意:自动生成的SQL脚本建议手动校验后再投入使用,重点确认字段类型映射、默认值、外键约束等逻辑是否符合业务预期,避免自动生成规则和实际需求有偏差。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 14:45:03