在探索使用序列与
AUTO-INCREMENT
的细微差别时,我正在努力寻找一个如何制作与数据库无关的 liquibase 项目的现实示例。
场景要求:
创建一个包含一些列的表,插入数据,其中 PKID 的值是某个计算值
我的起点是现有的 postgres 数据库,它引用
.sql
中的 changeSet
文件来创建序列:
<sqlFile path="create-tables.sql" relativeToChangelogFile="true"/>
SQL 来自
create-tables.sql
CREATE TABLE new_table (
pkid integer NOT NULL,
);
CREATE SEQUENCE new_table_pkid_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
有一个changeSet可以根据顺序插入记录,如下:
<changeSet author="yoman" id="123">
<insert tableName="new_table">
<column name="pkid" valueComputed="nextval('new_table_pkid_seq')"/>
</insert>
</changeSet>
但是,MySQL 不支持序列。 Oracle 还以不同的语法使用序列。
所以我不知道如何制定一个适用于这三个人的解决方案?
我的想法是
放弃使用序列和/或函数,并对所有三个数据库使用自动增量。 然后删除 create-tables.sql 并使用 liquibase XML
changeSet
语法创建表。
在 postgres 中创建一个函数而不是序列,并在 Oracle 和 MySQL 中创建同名函数,模拟序列函数。 然后指定函数名称:
<column name="pkid" valueComputed="INCREMENT_FUNCTION()"/>
问题..
问题是我不知道如果我尝试#1,XML 会是什么样子(例如,我是否使用
dbms
?)?此外,序列提供了更大的灵活性,因此不确定其他贡献者是否同意使用自动增量。
不确定如何在 liquibase 中为这 3 个目标主机实际生成通用函数。
据我了解,liquibase 是一个推动数据库无关设置概念的工具。 但我找不到任何有关如何创建适用于多个数据库目标的 liquibase 项目的基本示例的文档。
选项:
Oracle 12c 支持
AUTO_INCREMENT
,所以这是一种选择。不要试图成为数据库不可知论者。我过去见过许多公司尝试构建与数据库无关的应用程序。问题是你最终会做出妥协,并且最终会得到可以在任何地方运行的糟糕的应用程序。大多数这些公司现在都倒闭了
有一个CODE_CONTROL表的概念;但这是一个糟糕的选择,我什至不打算解释它!
虽然一些不可知论似乎是可能的,但最好关注您需要支持的数据库。然后,您可以在 liquibase 需要发挥作用的情况下使用
dbms
属性,例如:
<changeSet author="yoman" id="123" dbms="postgresql">
<insert tableName="new_table">
<column name="pkid" valueComputed="nextval('new_table_pkid_seq')"/>
</insert>
</changeSet>
<changeSet author="yoman" id="123" dbms="!postgresql">
<insert tableName="new_table">
<column name="pkid" valueComputed="new_table_pkid_seq.NEXTVAL"/>
</insert>
</changeSet>