显示导航

365bet地区数据库迁移

在本指南中,我们将学习如何使用365bet地区数据库迁移插件

s尼拉夫·阿萨尔·塞尔吉奥·德尔阿莫

365bet地区版本 4.0.1

365bet地区培训

365bet地区培训由创建并积极维护365bet地区框架的人们开发和交付

入门

在本指南中,您将学习如何使用365bet地区数据库迁移插件。我们将创建一个具有简单域类的应用程序,并将其扩展以实现以下目的:

  • 为数据库进行基线迁移

  • 将列更改为可为空

  • 将列添加到现有表

  • 重新设计表格并迁移现有数据

您将需要什么

要完成本指南,您将需要以下内容

  • 花些时间在你手上

  • 体面的文本编辑器或IDE

  • 安装了JDK或更高版本JAVA首页适当配置

如何完成指南

要开始,请执行以下操作

要么

365bet地区指南存储库包含两个文件夹

  • 初始初始项目通常是一个简单的365bet地区应用程序,其中包含一些其他代码,可以帮助您快速入门

  • 完成一个完整的示例它是按照指南中介绍的步骤进行操作并将这些更改应用于文档的结果。初始

要完成指南,请转到初始

  • 光盘进入grails指南grails数据库迁移初始

并按照下一节中的说明进行操作

您可以直接前往完成的例子如果你光盘进入grails指南grails数据库迁移完成

编写申请

我们将编写一个涉及类的简单应用程序类最初将具有自己的属性,其中也包含有关地址的信息。随着我们对域的发展,我们会将属性拆分成自己的属性地址365bet地区域类我们将使用365bet地区数据库迁移插件来管理这些过渡

安装数据库

创建一个MySQL数据库

让我们使用MySql设置物理数据库,而不是依赖于内存数据库中的默认H

  • 的MySQL安装数据库

  • 创建ID为的管理员访问权限和密码

  • 打开MySql命令行客户端

在命令行客户端中运行这些命令,以创建和使用数据库。显示表格命令应返回一个空集

365bet地区安装365bet地区以使用MySQL数据库

创建数据库dbmigration字符集utf整理utf常规ci使用dbmigration显示数据库显示表

365bet地区现在我们需要配置365bet地区应用程序以指向新的dbmigration数据库我们将编辑建立gradleyml应用程序档案

建立gradle
依赖运行时'MySQL连接器'
...
}
grails应用配置会议应用yml
数据源:
    派对: 真正
    jmxExport: 真正
    driverClassName: com mysql jdbc驱动程序
    方言: org休眠方言MySQL InnoDBDialect
    用户名: 
    密码: 
环境:
    发展:
        数据源:
            dbCreate: 没有(1)
            网址: jdbc mysql localhost dbmigration useUnicode是characterEncoding UTF
1 dbCreate定义我们是否要根据域模型自动生成数据库,将其设置为没有365bet地区因为我们将使用365bet地区数据库迁移插件来管理数据库模式的管理

域类

在适当的程序包中创建一个域类

365bet地区应用程序域演示Person groovy
演示进口 grails编译器365bet地区CompileStatic

365bet地区CompileStatic
  {

    那么整数年龄

安装数据库迁移插件

要安装365bet地区365bet地区数据库迁移插件我们需要添加到建立gradle:

建立gradle
buildscript依赖类路径'org grails插件数据库迁移RC'依赖项编译'org grails插件数据库迁移RC'
}

还要告诉Gradle有关迁移文件夹的位置请确保在配置之前依存关系配置,以便文件夹声明生效

建立gradle
sourceSets主要资源srcDir'365bet地区应用迁移'
        }
    }
}

实际的数据库迁移

数据库迁移是在保留现有数据的同时对数据库进行的架构更改如果没有用于管理数据库迁移的工具,团队可能需要依靠容易出现SQL错误的手动通信流程和昂贵的风险管理来实施解决方案数据库迁移插件可让您管理对数据库进行的结构更改它可以自动执行增量更改,使它们可重复可见和可跟踪。

使用该插件涉及的一般工作流程如下

基准线

  1. 定义域的当前状态

  2. 使用liquibase从changelog创建数据库

  3. 在应用程序中设置配置选项以使用数据库迁移插件

开发流程

  1. 更改域对象

  2. 使用插件为数据库生成更改日志添加

  3. 使用插件更新数据库

数据库迁移基准

与其使用GORM模式自动生成,不如使用数据库更改数据库模式液基365bet地区365bet地区数据库迁移插件使用的数据库迁移工具

我们想在启动时运行迁移,而我们的迁移将位于更新日志

grails应用配置会议应用yml
ils插入:
        数据库迁移:
            updateOnStart: 真正
            updateOnStartFileName更新日志

该插件附带几个命令,其中一个命令dbm生成gorm更改日志使用当前GORM类的Groovy DSL文件生成初始变更日志

grails dbm生成gorm changelog changelog groovy

这将生成一个变更日志,例如

grails应用程序迁移changelog groovy
databaseChangeLog changeSet作者: "Nirav Assar生成", ID: "1497549057046-1"createTabletableName: ""自动递增: "真正", 那么: "ID", 类型: "比金特"约束首要的关键: "真正", primaryKeyName: "人PK"那么: "", 类型: "比金特"约束可为空: ""那么: "年龄", 类型: "INT"约束可为空: ""那么: "那么", 类型: "VARCHAR"约束可为空: "")
            }
        }
    }
}

您可能会看到以下INFO日志语句这是一个非错误

INFO AM liquibase无法使用类org grails插件databasemigration liquibase GormDatabase作为Liquibase服务,因为它没有无参数构造函数

将初始变更日志移至其自己的文件,并从主变更日志文件引用它

cp grails应用程序迁移changelog groovy grails应用程序迁移创建人员表groovy

替换内容更新日志

grails应用程序迁移changelog groovy
databaseChangeLog包括文件: '创建人员表groovy'
}

应用迁移

grails dbm更新

数据库表已创建

> 节目 桌子;

dbmigration中的表

数据库更改日志

数据库更改日志锁

桌子数据库更改日志, 数据库更改日志锁数据库迁移插件使用它来跟踪数据库迁移

表对应于

描述人

领域

类型

空值

默认

额外

ID

比金特

没有

自动递增

比金特

没有

年龄

整型

没有

那么

varchar

没有

使列为空

在本节中,我们将做一个简单的更改以使列可以为空。年龄列当前需要一个值,我们使其变为可空值,然后继续迁移数据库以反映该值

在里面域对象使age属性可为空

365bet地区应用程序域演示Person groovy
演示进口 grails编译器365bet地区CompileStatic

365bet地区CompileStatic
  {

    那么整数年龄静态的约束年龄可为空: 真正
    }

}

请注意,在域对象中进行更改不会影响数据库。我们必须为更新日志为使更改生效请运行下一个命令

grails dbm gorm diff将年龄约束更改为可为空的groovy add

新的include语句已添加到更新日志

grails应用程序迁移changelog groovy
databaseChangeLog包括文件: '创建人员表groovy'包括文件: '将年龄约束更改为可空规则'
}

也会创建一个单独的变更集

grails应用程序迁移将年龄限制更改为可为空的常规
databaseChangeLog changeSet作者: "Nirav Assar生成", ID: "1497551594095-1"dropNotNullConstraint: "整型", columnName: "年龄", tableName: "")
    }
}

如果我们进行迁移

grails dbm更新

专栏年龄在里面

领域

类型

空值

默认

额外

ID

比金特

没有

自动递增

比金特

没有

年龄

整型

那么

varchar

没有

我们将一些属性添加到一个地址来演示我们的第二次迁移

365bet地区应用程序域演示Person groovy
演示进口 grails编译器365bet地区CompileStatic

365bet地区CompileStatic
  {

    那么整数年龄街道名称邮政编码静态的约束年龄可为空: 真正街道名称可为空: 真正可为空: 真正邮政编码可为空: 真正
    }

}

grails dbm gorm diff将地址字段添加到人员groovy添加

该命令将新的include语句添加到更新日志

grails应用程序迁移changelog groovy
databaseChangeLog包括文件: '创建人员表groovy'包括文件: '将年龄约束更改为可空规则'包括文件: ''
}

也会创建一个单独的变更集

grails应用迁移将地址字段添加到人员常规
databaseChangeLog changeSet作者: "Nirav Assar生成", ID: "1497552798178-1"addColumntableName: ""那么: "", 类型: "varchar"作者: "Nirav Assar生成", ID: "1497552798178-2"addColumntableName: ""那么: "街道名称", 类型: "varchar"作者: "Nirav Assar生成", ID: "1497552798178-3"addColumntableName: ""那么: "邮政编码", 类型: "varchar")
        }
    }
}

如果我们进行迁移

grails dbm更新

新栏街道名称, , 邮政编码在中创建

$描述人

领域

类型

空值

默认

额外

ID

比金特

没有

自动递增

比金特

没有

年龄

整型

那么

varchar

没有

varchar

街道名称

varchar

邮政编码

varchar

重新设计表格

假设我们要重新设计可以有很多地址■在进行这种类型的域对象重新设计时,我们必须考虑一些方面

  1. 我们可以在changelog文件中编写自定义sql以传输现有数据

下图描述了重新设计

地址域对象可以如下编码

365bet地区应用程序域演示Person groovy
演示进口 grails编译器365bet地区CompileStatic

365bet地区CompileStatic
  {

    那么整数年龄静态的有很多地址地址静态的约束年龄可为空: 真正
    }

}
grails应用程序域演示地址groovy
演示进口 grails编译器365bet地区CompileStatic

365bet地区CompileStatic
 地址人人街道名称邮政编码静态的属于静态的可为空: 真正可为空: 真正邮政编码可为空: 真正
    }
}

运行数据库迁移命令,该命令会将新的域对象与现有数据库进行比较,并生成liquibase声明以迁移架构

grails dbm gorm diff创建地址表groovy添加

该命令将新的include语句添加到更新日志

grails应用程序迁移changelog groovy
databaseChangeLog包括文件: '创建人员表groovy'包括文件: '将年龄约束更改为可空规则'包括文件: ''
}

也会创建一个单独的变更集

grails应用程序迁移创建地址表groovy groovy
作者: "Nirav Assar生成", ID: "1497553930799-1"createTabletableName: "地址"自动递增: "真正", 那么: "ID", 类型: "比金特"约束首要的关键: "真正", primaryKeyName: "地址PK"那么: "", 类型: "比金特"约束可为空: ""那么: "", 类型: "VARCHAR"那么: "", 类型: "比金特"约束可为空: ""那么: "街道名称", 类型: "VARCHAR"那么: "邮政编码", 类型: "VARCHAR"changeSet作者: "Nirav Assar生成", ID: "1497553930799-2"baseColumnNames: "人名", baseTableName: "地址", : "FK ihijcn kdfwffke c sjqeb", : "", : "", referencedColumnNames: "ID", : ""changeSet作者: "Nirav Assar生成", ID: "1497553930799-3"dropColumncolumnName: "", tableName: ""作者: "Nirav Assar生成", ID: "1497553930799-4"dropColumncolumnName: "街道名称", tableName: ""作者: "Nirav Assar生成", ID: "1497553930799-5"dropColumncolumnName: "邮政编码", tableName: "")
    }

创建地址表groovy groovy好像

grails应用程序迁移创建地址表groovy groovy
作者: "Nirav Assar生成", ID: "1497553930799-1"createTabletableName: "地址"自动递增: "真正", 那么: "ID", 类型: "比金特"约束首要的关键: "真正", primaryKeyName: "地址PK"那么: "", 类型: "比金特"约束可为空: ""那么: "", 类型: "VARCHAR"那么: "人名", 类型: "比金特"约束可为空: ""那么: "街道名称", 类型: "VARCHAR"那么: "邮政编码", 类型: "VARCHAR"changeSet作者: "Nirav Assar生成", ID: "1497553930799-2"addForeignKeyConstraintbaseColumnNames: "人名", baseTableName: "地址", : "", 可延期的: "", : "", referencedColumnNames: "ID", : "")
    }
    (1)作者: "", ID: "迁移人员数据"sql"""插入地址版本人id街道名称城市邮政编码选择id人的街道名称城市邮政编码"""changeSet作者: "Nirav Assar生成", ID: "1497553930799-3"columnName: "", tableName: ""作者: "Nirav Assar生成", ID: "1497553930799-4"dropColumncolumnName: "街道名称", tableName: ""作者: "Nirav Assar生成", ID: "1497553930799-5"dropColumncolumnName: "邮政编码", tableName: "")
    }
1 我们添加的变更集在创建地址表,但在从中删除列之前

运行迁移

grails dbm更新

人员表看起来像

$描述人

领域

类型

空值

默认

额外

ID

比金特

没有

自动递增

比金特

没有

年龄

整型

那么

varchar

没有

$描述地址

领域

类型

空值

默认

额外

ID

比金特

没有

自动递增

比金特

没有

人名

比金特

没有

varchar

街道名称

varchar

邮政编码

varchar

总结本指南,我们了解了在迁移现有数据时如何使用数据库迁移插件来更改列名称,添加列并可能重新设计表。重要的是要注意,数据库迁移由典型的工作流程组成

  1. 更改域对象

  2. 生成更改日志,该更改日志将识别现有数据库和已编辑域对象之间的数据库结构差异

  3. 考虑任何现有数据进行迁移

  4. 执行数据库迁移脚本

您需要365bet地区帮助吗

OCI赞助了本指南的创建OCI提供了几种365bet地区服务:

免费咨询

OCI 365bet地区团队包括365bet地区联合创始人Jeff Scott Brown和Graeme Rocher检查我们的365bet地区课程并向发展和维护365bet地区的工程师学习

Grails OCI团队