使用 gradle 和 flyway 插件创建 MySQL 模式

Posted

技术标签:

【中文标题】使用 gradle 和 flyway 插件创建 MySQL 模式【英文标题】:Create MySQL schema with gradle and flyway plugin 【发布时间】:2015-04-04 14:14:08 【问题描述】:

我们在项目中使用 gradle 来构建一个多存储库项目。由于它是在 Jenkins 构建服务器上自动构建和测试的,因此我们需要设置和拆除数据库。

我对持续集成最佳实践的理解是,我们应该只需按一下按钮即可设置和拆除测试数据库。即使这还不存在。所以我想要一个 gradle 任务,如果它还不存在,它只是在 mysql 中创建一个数据库。

浏览这个精美的网站时,当我被指出使用 Gradle 的 flyway 插件时,我以为我已经找到了答案。显然flyway从2.1版(http://java.dzone.com/announcements/flyway-21-released-automatic)开始支持自动模式创建,所以应该可以使用插件,不是吗?

但是,如果我运行 gradle flywayInitgradle flywayClean,则每次收到消息 unknown database: test 时都使用像 url = 'jdbc:mysql://127.0.0.1:3306/test' 这样的 URL。所以我尝试了以下方法:

buildscript 
    repositories 
        mavenCentral()
    

    dependencies 
        classpath 'org.flywaydb:flyway-gradle-plugin:3.0'
    


// Use Flyway plugin to create database
apply plugin: 'flyway'
flyway 
    user = 'root'
    password = 'root'
    url = 'jdbc:mysql://127.0.0.1:3306'
    schemas = ['test']

我预计会出现另一个连接错误。相反,构建成功,但没有创建数据库模式。如何使用 gradle 和 Flyway 创建模式?如果我们可以在没有 Flyway 的情况下做到这一点,那也很好。

更新: 事实证明这很好用。我正在查看我的数据库模式列表的过时版本。显然,Sequel Pro 太愚蠢了,无法在刷新时更新模式列表。或者我太笨了,无法在 Sequel pro 中找到正确的按钮。

更新 2: 为了确保每次构建都发生这种情况,我在 build.gradle 中添加了以下行:

// Add dependencies to tasks
build.dependsOn flywayInit

【问题讨论】:

【参考方案1】:

我关注了Get started with Gradle and Flyway,一切正常。

我使用的是 gradle 2.2,build.gradle 文件是:

buildscript 
    repositories 
        mavenCentral()
    
    dependencies 
        classpath 'mysql:mysql-connector-java:5.1.34'
        classpath 'org.flywaydb:flyway-gradle-plugin:3.1'
    


apply plugin: 'flyway'
apply plugin: 'java'

flyway 
    url = 'jdbc:mysql://localhost:3306'
    user = 'root'
    password = 'root'
    schemas = ['demo1']

之后,运行 gradle flywayMigrate -i。如果数据库不存在,将由flyway创建。

您可以在此处查看 Flyway 任务列表:link

【讨论】:

是的,我还发现现在一切运行正常。事实证明它一直在工作,但我的数据库客户端没有更新......我似乎能够运行 flywayInit 任务就好了。【参考方案2】:

你所拥有的和 Flyway 可以做的之间有一个微妙但重要的区别:因为版本 2.1 Flyway 可以创建模式,但不能创建数据库。 p>

MySQL url 中的名称是您必须使用 MySQL 命令create database 自己创建的数据库。在该数据库中,Flyway 可以创建您使用 flyway.schemas 指定的模式。

【讨论】:

正如我在其他评论中所述,它确实有效。数据库只是 MySQL 使用的模式的名称。我的意思实际上是架构。

以上是关于使用 gradle 和 flyway 插件创建 MySQL 模式的主要内容,如果未能解决你的问题,请参考以下文章

java Gradle中的Flyway插件配置

带有 groovy 环境的 flyway gradle 插件

为啥我的 Gradle 构建失败并出现“未找到插件 [id: 'org.flywaydb.enterprise.flyway', version: '6.5.0']”错误?

使用flyway时在启动时清除数据库

如何一起使用Spring启动,JOOQ和Flyway?

使用 Jenkins 和 Gradle 运行 Flyway 迁移 - 无法解析位置类路径:db/migration