我正在评估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`)
);
Run Code Online (Sandbox Code Playgroud)
数据库中填充了以下插入表示的一些现有数据:
INSERT INTO `Person` (`id`, `firstName`, `lastName`) VALUES (1, 'foo', 'bar');
Run Code Online (Sandbox Code Playgroud)
然后我决定在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;
Run Code Online (Sandbox Code Playgroud)
Liquibase可以让这个用例更容易吗?
liquibase为您提供的主要功能是能够跟踪哪些更改已应用于哪些数据库.
在您的示例中,您列出的SQL将正是liquibase将要执行的操作,但它将能够知道您的开发数据库是在版本Y,当您"更新"您的数据库时,它将只应用一些新的更改,而生产在版本X上,当您"更新"生产时,它将应用更多更改.
注意:liquibase独立跟踪更改,而不是使用单个版本来支持多个开发人员和/或代码分支.
除了跟踪应用的变化之外,liquibase还可以为您提供的其他优势包括:
我最近也经历过同样的事情。请参阅:向现有表添加不可为空的列失败。“value”属性是否被忽略?
如果不将现有行的值设置为列的默认值,则无法(在单个 SQL 语句中)添加包含该值的列。因此,如果您希望现有行具有与添加的新行不同的值(包括您根本不希望列上有默认值),您将需要至少两个 SQL 语句。因此,使用 liquibase 您仍然需要在您描述的三个步骤中添加此列。
所以我对你的问题的回答是:是的,使用 liquibase 比仅仅维护一系列 SQL 脚本有优势。但这不是其中之一。:)