【问题标题】:How to execute multiple inserts when using LIQUIBASE WITHOUT CHANGELOGS使用 LIQUIBASE WITHOUT CHANGELOGS 时如何执行多个插入
【发布时间】:2015-11-25 04:16:24
【问题描述】:

根据this 文档

Liquibase 可以在给定路径中执行多个sql 文件,而无需任何更改日志。但是,当我使用以下插入创建文件时

insert into address (id, line1, line2) values (1, '121 Main Ave', null);
insert into address (id, line1, line2) values (2, '662 Broadway', 'Suite 3317');
insert into address (id, line1, line2) values (3, '412 Riverview', null);

我收到以下错误

sql 语法无效

【问题讨论】:

  • 您始终需要至少 一个 更改日志文件,然后包含其他所有内容。那么,您是如何将这些文件包含在您的主变更日志中的呢?

标签: liquibase


【解决方案1】:

Liquibase 无法识别您的 sql 文件。 在你的 sql 文件上添加这两行:

--liquibase formatted sql
--changeset {authorName}:{id}

根据您的意愿更改作者姓名和 ID。您也可以在 changelog.xml 文件中执行类似的操作:

<changeSet author="authorName" id=”id”>
  <sqlFile path="insertcommands.sql"/>
</changeSet>

在这种情况下,您不需要放在 insertcommands.sql 文件的顶部

--liquibase formatted sql
--changeset {authorName}:{id}

就像你之前做的那样。

PS - 在 liquibase-3.4 和 mysql5.5 上测试

【讨论】:

  • 谢谢你的建议。但是你能告诉我为什么当文档说没有变更日志的 liquibase 时我需要注释
  • 不知道,可能是他们忘记更新文档了……只是猜测
  • 从您在原始问题中提到的页面:“要引导该过程,您需要一个使用 includeAll 命令的主变更日志文件。我知道标题是“没有变更日志的 Liquibase”,但是一旦您已经创建了这个文件,你再也不用碰它了。”此外,您链接的内容是一篇博文,而不是真正的“文档”。
【解决方案2】:

多查询有两种写法

1) 使用&lt;sqlFile&gt; 标签。
path : 所有插入查询写入的文件路径

<changeSet author="liquibase-docs" id="sqlFile-example"> 
    <sqlFile encoding="utf8" path="filepathsql"relativeToChangelogFile="true" splitStatements="true"stripComments="true"/>
</changeSet>`  

注意:需要为多个查询执行写入属性 splitStatements=true
http://www.liquibase.org/documentation/changes/sql_file.html

2)&lt;sql&gt;标签

<changeSet author="liquibase-docs" id="sql-example">  
    <comment>insert queries</comment>
    <sql dbms="h2, oracle" 
                splitStatements="true"
                stripComments="true">         
        insert into address (id, line1, line2) values (1, "121 Main Ave", null);    
        insert into address (id, line1, line2) values (2, "662 Broadway", "Suite 3317");  
        insert into address (id, line1, line2) values (3, "412 Riverview", null);     
    </sql>    
</changeSet>    

http://www.liquibase.org/documentation/changes/sql.html

【讨论】:

  • 感谢关于 splitStatements 的注释,这是我的问题!
【解决方案3】:

您可以将 loadData(或 loadUpdate 用于表中的部分更改)用于此类目的:

<loadData encoding="UTF-8"
                  file="[path to csv]"
                  separator=";"
                  tableName="ADDRESS"/>

并提供包含以下内容的 CSV 文件:

id;line1;line2
1;121 Main Ave;null
2;662 Broadway;Suite 3317
3;412 Riverview;null

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-10
    • 2015-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-02
    • 1970-01-01
    相关资源
    最近更新 更多