【问题标题】:How do I differentiate between databases when using e.g. sequence使用例如数据库时如何区分数据库顺序
【发布时间】:2012-06-30 01:17:34
【问题描述】:

我刚开始使用Liquibase 并偶然发现了区分不同数据库功能的问题。

我们希望支持多个数据库(Oracle、MySQL、Derby - 仅举三例)。

他们都有不同的能力。具体来说,Oracle 支持sequences,而 MySQL 和 Derby 不支持。

当我让 hibernate 生成 DDL 时,我可以选择不同的方言,它会考虑这些不同的功能并在使用 Oracle 时生成Sequencer,在使用 Derby 或 MySQL 时使用普通表(用于 ID 生成)。

现在,我知道我可以通过在 dbms 属性中指定“oracle”来约束变更集。但是,我怎样才能为其他数据库做普通表解决方案呢? dbms 似乎没有“非预言机”属性。

其他人如何处理这个问题? (我在 liquibase 页面和论坛上都找不到任何关于它的信息。)

【问题讨论】:

    标签: liquibase


    【解决方案1】:

    尝试在 changset 上使用 precondition。支持布尔运算。

    例如

     <preConditions onFail="CONTINUE">
         <or>
             <dbms type="oracle" />
             <dbms type="mysql" />
         </or>
     </preConditions>
    

    【讨论】:

    • 感谢您的帮助马克。我已经找到了preConditions,但这意味着我必须列出所有不支持sequences 的数据库。如果 liquibase 扩展了支持的数据库列表(或者一个不支持序列的数据库在未来的版本中确实支持这个),我将不得不考虑这一点并扩展列表。我希望有一个更少的“不得不重新考虑”的解决方案。
    • 哦,也许现在我明白了您所说的支持布尔运算的意思:您可以像这样添加&lt;not&gt;&lt;not&gt;&lt;dbms type="oracle"/&gt;&lt;/not&gt;
    • 是的,我就是这个意思。无论哪种方式,您都必须维护某种列表。支持(或不支持)序列的数据库。真正的跨平台架构并非没有挑战 :-)
    【解决方案2】:

    另一种方法是将所有序列放在一个 changlog 文件中,您在主 changelog 中 include,然后执行以下操作:

    <changeSet
        dbms="oracle,db2,db2i"
        author="mccallim (generated)"
        id="1419011907193-1"
    >
        <createSequence
            schemaName="${main.schema}"
    ...
    

    该变更集仅针对列出的 DBMS 执行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多