使用Liquibase进行数据库迁移有什么好处?

时间:2012-04-05 17:32:31

标签: sql liquibase

我正在评估Liquibase并试图弄清楚它是否对使用SQL脚本进行数据迁移有任何好处。假设我正在做以下事情:

我的0版数据库架构如下所示:

CREATE TABLE  `Person` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `firstName` varchar(255) NOT NULL,
  `lastName` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
);

数据库中填充了以下插入表示的一些现有数据:

INSERT INTO `Person` (`id`, `firstName`, `lastName`) VALUES (1, 'foo', 'bar');

然后我决定在Person表中添加另一个非空的列,但我不想丢失任何现有数据。从版本0到版本1的迁移脚本如下所示:

ALTER TABLE `Person` ADD COLUMN `dob` date DEFAULT NULL;

UPDATE `Person` set `dob` = '1970-01-01';

ALTER TABLE `Person` MODIFY COLUMN `dob` NOT NULL;

Liquibase可以让这个用例更容易吗?

3 个答案:

答案 0 :(得分:6)

liquibase为您提供的主要功能是能够跟踪哪些更改已应用于哪些数据库。

在您的示例中,您列出的SQL将正是liquibase将要执行的操作,但是它将能够知道您的开发数据库是在版本Y,当您“更新”您的数据库时,它将只应用一些新的更改,而生产是在版本X上,当您“更新”生产时,它将应用更多更改。

注意:liquibase独立跟踪更改,而不是使用单个版本来支持多个开发人员和/或代码分支。

除了跟踪应用的更改之外,liquibase还会为您提供的其他优势包括:

  • 能够对多种数据库类型具有相同的更改说明。
  • 能够在应用的内容中使用if / then逻辑。
  • 生成数据库历史记录。
  • 能够轻松指定更复杂的多语句更改。

答案 1 :(得分:2)

我最近经历了同样的事情。请参阅:Adding a non-nullable column to existing table fails. Is the "value" attribute being ignored?

没有办法(在单个SQL语句中)添加具有现有行值的列,而不将其设置为列的默认值。因此,如果您希望现有行具有与添加的新行不同的值(包括根本不想在列上使用默认值),则至少需要两个SQL语句。因此,使用liquibase,您仍然需要在您描述的三个步骤中添加此列。

所以我对你的问题的回答是:是的,使用liquibase而不仅仅是维护一系列SQL脚本是有好处的。但这不是其中之一。 :)

答案 2 :(得分:0)

在我看来,Mite给你两全其美。您可以继续使用您的sql脚本,它可以管理是否在数据库上执行了脚本,并为您提供了与典型的基于rails的迁移或Liquibase相同的上下功能。

让我知道你的想法。

https://github.com/soitgoes/mite