由Liquibase Maven插件为Postgres生成的数据库更改日志的插入查询中的区分大小写的列名

时间:2018-07-20 11:24:43

标签: postgresql maven liquibase

我尝试使用liquibase-maven-plugin更新我的postgres数据库。

以下是我pom文件中的插件配置。

<plugin>
    <groupId>org.liquibase</groupId>
    <artifactId>liquibase-maven-plugin</artifactId>
    <version>3.6.2</version>
    <configuration>
        <propertyFile>src/main/resources/db/liquibase.properties</propertyFile>
    </configuration>
</plugin>

Liquibase属性文件如下。

url=jdbc:postgresql://localhost:5432/myserver
username=postgres
password=password
changeLogFile=src/main/resources/db/changelog/db.changelog-master.yaml
driver=org.postgresql.Driver
verbose=true
dropFirst=false

然后我执行以下命令来更新空白数据库。

mvn liquibase:update

但是我看到以下错误。

enter image description here

要了解该问题,我使用以下命令生成了正在执行的SQL。

mvn liquibase:updateSQL

上面的命令是根据SQL生成的。

-- Create Database Lock Table
CREATE TABLE databasechangeloglock (ID INTEGER NOT NULL, LOCKED BOOLEAN NOT NULL, LOCKGRANTED TIMESTAMP WITHOUT TIME ZONE, LOCKEDBY VARCHAR(255), CONSTRAINT DATABASECHANGELOGLOCK_PKEY PRIMARY KEY (ID));

-- Initialize Database Lock Table
DELETE FROM databasechangeloglock;

INSERT INTO databasechangeloglock (ID, LOCKED) VALUES (1, FALSE);

-- Lock Database
UPDATE databasechangeloglock SET LOCKED = TRUE, LOCKEDBY = 'DESKTOP-9U9TDA6 (192.168.0.110)', LOCKGRANTED = '2018-07-20 16:32:11.048' WHERE ID = 1 AND LOCKED = FALSE;

-- Create Database Change Log Table
CREATE TABLE databasechangelog (ID VARCHAR(255) NOT NULL, AUTHOR VARCHAR(255) NOT NULL, FILENAME VARCHAR(255) NOT NULL, DATEEXECUTED TIMESTAMP WITHOUT TIME ZONE NOT NULL, ORDEREXECUTED INTEGER NOT NULL, EXECTYPE VARCHAR(10) NOT NULL, MD5SUM VARCHAR(35), DESCRIPTION VARCHAR(255), COMMENTS VARCHAR(255), TAG VARCHAR(255), LIQUIBASE VARCHAR(20), CONTEXTS VARCHAR(255), LABELS VARCHAR(255), DEPLOYMENT_ID VARCHAR(10));

-- Changeset src/main/resources/db/changelog/db.changelog-master.yaml::1482291859539-1::aguna (generated)
CREATE TABLE "Environment" ("Id" SERIAL NOT NULL, "Name" VARCHAR(50) NOT NULL, "Notes" VARCHAR(255), "SitePassword" VARCHAR(255), "SiteSecret" VARCHAR(255) NOT NULL, "SiteUser" VARCHAR(255), "Status" BOOLEAN NOT NULL, "Url" VARCHAR(255) NOT NULL, CONSTRAINT "CONSTRAINT_E" PRIMARY KEY ("Id"));

INSERT INTO "databasechangelog" ("ID", "AUTHOR", "FILENAME", "DATEEXECUTED", "ORDEREXECUTED", "MD5SUM", "DESCRIPTION", "COMMENTS", "EXECTYPE", "CONTEXTS", "LABELS", "LIQUIBASE", "DEPLOYMENT_ID") VALUES ('1482291859539-1', 'aguna (generated)', 'src/main/resources/db/changelog/db.changelog-master.yaml', NOW(), 1, '8:1be0ac538f0540ba1bf94f6f2ac8d466', 'createTable tableName=Environment', '', 'EXECUTED', NULL, NULL, '3.6.2', '2084531992');

-- Release Database Lock
UPDATE databasechangeloglock SET LOCKED = FALSE, LOCKEDBY = NULL, LOCKGRANTED = NULL WHERE ID = 1;

我观察到,用于创建表databasechangelog的脚本不要将列名加双引号,即,列名以小写创建(postgres的默认大小写)。但是用于在同一表中插入记录的脚本在大写形式中具有列名,并且双引号即保持大小写。由于postgres区分大小写,因此insert语句将引发所提到的异常。

在我看来,插件似乎有问题。任何解决方案将不胜感激。

1 个答案:

答案 0 :(得分:0)

好像我找到了问题的答案。我已经在主变更日志文件(即db.changelog-master.yaml)的“ databaseChangeLog”的根目录中定义了以下内容。我从那里删除了它,并在需要时将其添加到子变更日志文件和变更集。

- objectQuotingStrategy: QUOTE_ALL_OBJECTS

现在工作正常。我还看到打开了以下票证,其中谈到了liquibase中的一个相关错误。可能是因为这个原因。

https://liquibase.jira.com/browse/CORE-3073