Liquibase 为 postgres 创建架构

问题描述 投票:0回答:5

我正在使用 Dropwizard (1.0.0) 和 Liquibase 创建数据库(如果数据库不存在)。

这里的问题是我使用了不同的 Postgres 架构(非公开)。看起来 Liquibase 之前无法创建这个模式,是吗?我期望 Liquibase 生成此架构,但如果我尝试构建数据库,它总是会抛出“未找到名称为 xx 的架构”。

java postgresql liquibase dropwizard
5个回答
15
投票

即使 Liquibase 在其捆绑的更改/重构中没有

CREATE SCHEMA
(因此在 dropwizard 期间不会生成
db dump
),您仍然可以使用
sql
将其作为变更集包含在迁移变更日志中标签
,如下:

<changeSet author="christian" id="1">
    <sql dbms="postgresql" endDelimiter=";">
        CREATE SCHEMA foo
    </sql>
</changeSet>

请注意,Liquibase 将在 PUBLIC

 模式中创建它自己的 
表,无论如何 - 在应用任何变更集之前: 如果你在 dropwizard 中运行
db migrate --dry-run
,你会看到 Liquibase 首先执行

CREATE TABLE PUBLIC.DATABASECHANGELOGLOCK ... CREATE TABLE PUBLIC.DATABASECHANGELOG ...

跑步前

CREATE SCHEMA foo;
    

9
投票
不是直接回答问题,而是将其发布给遇到我在多个模式中创建表时遇到的错误的任何人。我使用

defaultSchemaName

 配置从 Maven 执行此操作时遇到错误。

[ERROR] Failed to execute goal org.liquibase:liquibase-maven-plugin:3.6.2:update (default-cli) on project demo: Error setting up or running Liquibase: ERROR: relation "databasechangelog" already exists [Failed SQL: 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))] -> [Help 1]

我尝试通过将以下配置添加到 pom.xml 来修复它,但这只是部分解决方案:

<defaultSchemaName>foo</defaultSchemaName> <changelogSchemaName>foo</changelogSchemaName>

最后,我通过将 foo 添加到连接字符串的末尾来解决这个问题,如下所示

jdbc:postgresql://localhost:5432/postgres?currentSchema=foo


    


6
投票
Liquibase没有

CREATE SCHEMA

,您需要通过运行SQL查询来管理创建模式功能。

<changeSet author="liquibase_user" id="1"> <sql> CREATE SCHEMA IF NOT EXISTS liquibase_demo; </sql> </changeSet>
    

4
投票
除了您使用 Dropwizard 之外,

Spring Boot Pre-Liquibase 模块可以满足您的要求。

Liquibase 存在先有鸡还是先有蛋的问题,因为它不能用于配置自己的先决条件,例如模式。这就是 Pre-Liquibase 解决的问题。它先于 Liquibase 本身执行一些 SQL。

有时您需要在同一数据库主机上托管应用程序的多个实例。然后您需要通过模式将它们分开。这只是 Pre-Liquibase 的一种可能的用例。

Pre-Liquibase 适用于 Spring,因此它不能在您的 Dropwizard 场景中开箱即用。但请随意窃取想法。

(全面披露:我是Pre-Libuibase的作者)

简单的方法是使用默认模式 public 和“如果不存在 foo 则创建模式”对 liquibase 进行初始调用,然后使用实际迁移变更日志进行第二次调用。

0
投票

© www.soinside.com 2019 - 2024. All rights reserved.