8

我正在评估 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 能让这个用例变得更容易吗?

4

3 回答 3

5

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

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

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

除了跟踪应用的更改之外,liquibase 可以为您带来的其他优势包括:

  • 能够对多种数据库类型进行相同的更改描述。
  • 能够在应用的内容中拥有 if/then 逻辑。
  • 生成的数据库历史文档。
  • 能够轻松指定更复杂的多语句更改。
于 2012-04-06T17:38:54.660 回答
1

我最近经历了同样的事情。请参阅:向现有表添加不可为空的列失败。“值”属性是否被忽略?

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

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

于 2012-04-06T03:23:13.893 回答
0

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

让我知道你的想法。

https://github.com/soitgoes/mite

于 2012-07-28T22:35:11.393 回答