这是我的changelog.sql的第一个版本:
-- liquibase formatted sql
-- changeset kh:1
CREATE TABLE test_table (test_id INT, test_column VARCHAR(256), PRIMARY KEY (test_id))
--changeset kh:2
INSERT INTO test_table (test_id, test_column) VALUES(3,'saket');
这是我的changelog.sql 的更新(在第一个变更集中添加了一列):
-- liquibase formatted sql
-- changeset kh:1
CREATE TABLE test_table (test_id INT, test_column VARCHAR(256), test_column2 VARCHAR(256), PRIMARY KEY (test_id))
--changeset kh:2
INSERT INTO test_table (test_id, test_column) VALUES(3,'saket');
我使用以下命令执行 liquibase 更新:
docker run --rm -v /changelog:/liquibase/changelog liquibase/liquibase \
--url=jdbc:postgresql://xxxxxxxxxx:5432/postgres \
--changelog-file=changelog.sql --username=xxxx \
--password=xxxx update
我收到此错误:
Caused by: liquibase.exception.ValidationFailedException: Validation Failed:
1 changesets check sum
changelog.sql::1::kh was: 8:46ea95d67274343c559a1c5ddc8ee33 but is now: 8:ab7361c532323a6a32bc79d230a46574
我知道,在生产环境中运行它时,它应该失败,以免再次错误地启动脚本,但是,在非生产环境中,它应该如何工作?
我想象了 DevOps(非生产)场景中的三种解决方案:
在非生产环境中,可能需要对 SQL 进行更改,直到新功能得到验证。最佳实践是什么,还有其他解决方案吗?
校验和错误表明您正在修改已在特定数据库目标中执行的变更集。 因此,Liquibase 不明白您为什么要进行此修改。
sql语句“CREATE TABLE test_table”无法再次执行,因此添加附加列没有意义。
如果您想向已创建的表添加列,您实际上只有 2 个选择:
选项1可以通过使用Liquibase回滚,然后修改变更集,然后Liquibase更新来完成。 选项 2 可以通过添加新的变更集来完成。
两者都是 100% 有效的选项。
当您修改旧的更改集时,应用更改集时,此校验和将存储在 DATABASECHANGELOG 表中。
如果修改了变更集,校验和会发生变化,Liquibase 将抛出错误,因为存储的校验和不再与重新计算的校验和匹配。
您可以使用 validCheckSum 标签,它告诉 Liquibase 考虑对变更集有效的特定校验和值。
<validCheckSum>your-current-checksome</validCheckSum>