使用 liquibase 使用序列的与数据库无关的示例

问题描述 投票:0回答:2

在探索使用序列与

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 还以不同的语法使用序列。

所以我不知道如何制定一个适用于这三个人的解决方案?

我的想法是

  1. 放弃使用序列和/或函数,并对所有三个数据库使用自动增量。 然后删除 create-tables.sql 并使用 liquibase XML

    changeSet
    语法创建表。

  2. 在 postgres 中创建一个函数而不是序列,并在 Oracle 和 MySQL 中创建同名函数,模拟序列函数。 然后指定函数名称:

<column name="pkid" valueComputed="INCREMENT_FUNCTION()"/>

问题..

  1. 问题是我不知道如果我尝试#1,XML 会是什么样子(例如,我是否使用

    dbms
    ?)?此外,序列提供了更大的灵活性,因此不确定其他贡献者是否同意使用自动增量。

  2. 不确定如何在 liquibase 中为这 3 个目标主机实际生成通用函数。

据我了解,liquibase 是一个推动数据库无关设置概念的工具。 但我找不到任何有关如何创建适用于多个数据库目标的 liquibase 项目的基本示例的文档。

mysql postgresql oracle liquibase
2个回答
0
投票

选项:

  1. Oracle 12c 支持

    AUTO_INCREMENT
    ,所以这是一种选择。

  2. 不要试图成为数据库不可知论者。我过去见过许多公司尝试构建与数据库无关的应用程序。问题是你最终会做出妥协,并且最终会得到可以在任何地方运行的糟糕的应用程序。大多数这些公司现在都倒闭了

  3. 有一个CODE_CONTROL表的概念;但这是一个糟糕的选择,我什至不打算解释它!


0
投票

虽然一些不可知论似乎是可能的,但最好关注您需要支持的数据库。然后,您可以在 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>
© www.soinside.com 2019 - 2024. All rights reserved.