【问题标题】:Liquibase importing sql files for mysql fails on multiple statementsLiquibase 为 mysql 导入 sql 文件在多个语句上失败
【发布时间】:2013-08-20 05:57:12
【问题描述】:

我正在尝试将 Liquibase 用于已经有多个 SQL 更改日志文件(以前是手动维护的)的项目。使用来自stackoverflow某处的建议,我添加了一个

<includeAll path="db/initial"/>

指向我的初始更改日志文件,但它失败了,用处不大

您的 SQL 语法有错误

消息。玩弄我发现问题出在文件中的多个 sql 语句上。只要我提供了一个只有一个语句的文件,它就可以工作。

那么我如何告诉 Liquibase 从一个 sql 文件中执行多个语句呢?

【问题讨论】:

    标签: mysql liquibase


    【解决方案1】:

    再多搜索一下,发现问题不在于 Liquibase,而在于默认情况下拒绝执行多个语句的 MySql 驱动程序。

    关键是将 allowMultiQueries=true 添加到我的连接字符串中:

    url: jdbc:mysql://localhost/test_project?allowMultiQueries=true
    

    【讨论】:

    • 未来读者请注意——尽管这确实有效,但您可以通过使用 liquibase 的“splitStatements”属性来避免更改 JDBC 设置,正如@mark-oconnor 在他的回答中所说的那样。对我来说,这是一个更有趣的解决方案。
    【解决方案2】:

    我预计您会使用sql_file 重构来导入 SQL 文件。它支持“splitStatements”属性,无需更改 JDBC 设置即可解决您的问题。

    include 语句通常用于导入 liquibase 更改日志...。您是否已将文件调整为 formatted SQL changelogs?非常值得尝试一下,我已经包含了一个示例文件:

    示例

    scottTiger.sql

    --liquibase formatted sql
    
    --changeset mark:1
    CREATE TABLE BONUS (ENAME VARCHAR(10) NOT NULL, JOB VARCHAR(9) NOT NULL, SAL DECIMAL(7, 2), COMM DECIMAL(7, 2));
    ALTER TABLE BONUS ADD CONSTRAINT BONUS_PK PRIMARY KEY (ENAME, JOB);
    --rollback DROP TABLE BONUS;
    
    --changeset mark:2
    CREATE TABLE DEPARTMENT (DEPTNO INT NOT NULL, NAME VARCHAR(14), LOCATION VARCHAR(13), CONSTRAINT DEPT_PK PRIMARY KEY (DEPTNO));
    --rollback DROP TABLE DEPARTMENT;
    
    
    --changeset mark:3
    CREATE TABLE EMPLOYEE (EMPNO INT NOT NULL, NAME VARCHAR(10), JOB VARCHAR(9), BOSS INT, HIREDATE VARCHAR(12), SALARY DECIMAL(7, 2), COMM DECIMAL(7, 2), DEPTNO INT, CONSTRAINT EMP_PK PRIMARY KEY (EMPNO));
    ALTER TABLE PUBLIC.EMPLOYEE ADD CONSTRAINT BOSS_FK FOREIGN KEY (BOSS) REFERENCES PUBLIC.EMPLOYEE (EMPNO) ON UPDATE RESTRICT ON DELETE RESTRICT;
    ALTER TABLE PUBLIC.EMPLOYEE ADD CONSTRAINT DEPARTMENT_FK FOREIGN KEY (DEPTNO) REFERENCES PUBLIC.DEPARTMENT (DEPTNO) ON UPDATE RESTRICT ON DELETE RESTRICT;
    --rollback DROP TABLE EMPLOYEE;
    
    
    --changeset mark:4
    CREATE TABLE PROJECT (PROJECTNO INT NOT NULL, DESCRIPTION VARCHAR(100), START_DATE VARCHAR(12), END_DATE VARCHAR(12), CONSTRAINT PROJECT_PK PRIMARY KEY (PROJECTNO));
    --rollback DROP TABLE PROJECT;
    
    --changeset mark:5
    CREATE TABLE ROLE (ROLE_ID INT NOT NULL, DESCRIPTION VARCHAR(100), CONSTRAINT ROLE_PK PRIMARY KEY (ROLE_ID));
    --rollback DROP TABLE ROLE;
    
    
    --changeset mark:6
    CREATE TABLE PROJECT_PARTICIPATION (PROJECTNO INT NOT NULL, EMPNO INT NOT NULL, START_DATE VARCHAR(12) NOT NULL, END_DATE VARCHAR(12), ROLE_ID INT);
    ALTER TABLE PROJECT_PARTICIPATION ADD CONSTRAINT PARTICIPATION_PK PRIMARY KEY (PROJECTNO, EMPNO, START_DATE);
    ALTER TABLE PUBLIC.PROJECT_PARTICIPATION ADD CONSTRAINT EMPLOYEE_FK FOREIGN KEY (EMPNO) REFERENCES PUBLIC.EMPLOYEE (EMPNO) ON UPDATE RESTRICT ON DELETE RESTRICT;
    ALTER TABLE PUBLIC.PROJECT_PARTICIPATION ADD CONSTRAINT PROJECT_FK FOREIGN KEY (PROJECTNO) REFERENCES PUBLIC.PROJECT (PROJECTNO) ON UPDATE RESTRICT ON DELETE RESTRICT;
    ALTER TABLE PUBLIC.PROJECT_PARTICIPATION ADD CONSTRAINT ROLE_FK FOREIGN KEY (ROLE_ID) REFERENCES PUBLIC.ROLE (ROLE_ID) ON UPDATE RESTRICT ON DELETE RESTRICT;
    --rollback DROP TABLE PROJECT_PARTICIPATION;
    
    --changeset mark:7
    CREATE TABLE SALARYGRADE (GRADE INT NOT NULL, LOSAL INT NOT NULL, HISAL INT NOT NULL, CONSTRAINT SALGRADE_PK PRIMARY KEY (GRADE));
    --rollback DROP TABLE SALARYGRADE;
    

    注意:

    • 我喜欢 liquibase 的一点是它支持回滚。

    【讨论】:

    • 我使用了 includeAll 这样我就不需要单独列出每个 sql 文件。我不太关心回滚或格式化变更日志,因为这些是已应用于所有产品服务器的预 liquibase 变更日志,我主要需要它们来推出开发/测试服务器(以前我是用 mysql 手动完成的命令行)。
    猜你喜欢
    • 2016-11-16
    • 2017-08-06
    • 2015-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-28
    • 2012-07-02
    相关资源
    最近更新 更多