Liquibase:错误:CREATE DATABASE无法在事务块内运行

问题描述

我正在尝试使用liquibase在PostgreSQL上创建数据库。这是我的dbchangelog文件

<?xml version="1.0" encoding="UTF-8"?>

<databaseChangeLog
  xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
         http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.8.xsd">
  <changeSet  author="testuser"  id="3">
    <sql  dbms="postgresql"
            endDelimiter=";">
            CREATE DATABASE testdb;
    </sql>
  </changeSet>
</databaseChangeLog

当我尝试从我的项目目录运行liquibase update

Unexpected error running Liquibase: ERROR: CREATE DATABASE cannot run inside a transaction block [Failed SQL: (0) CREATE DATABASE testdb] 

我看到在PostgreSQL中设置AUTOCOMMIT = ON可以解决此问题,但是此方法仅适用于PostgreSQL 9.4及更低版本。但是我正在使用AWS RDS PostgreSQL 9.6.8

解决方法

简短: 将 runInTransaction="false" 添加到您的 changeSet

说明:

Liquibase 打开一个事务块,以保证 changeSet 完全执行或根本不执行。

PostgreSQL 文档说:CREATE DATABASE cannot be executed inside a transaction block.(见 PostgreSQL Doc on Create Database!)

因此,显然存在冲突行为,只能通过不使用事务块来避免。

请注意,使用多个命令停用事务行为,可能会导致更改集仅部分执行的问题。

,

Liquibase不适用于数据库创建。您应该已经准备好数据库模式,并且liquibase将用表/索引/ ...填充它。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...