java 用于postgres的Liquibase创建模式

5w9g7ksd  于 2022-11-27  发布在  Java
关注(0)|答案(4)|浏览(160)

我使用Dropwizard(1.0.0)和Liquibase创建一个数据库(如果它不存在)。
这里的问题是我使用的是不同的Postgres模式(非公共)。似乎Liquibase以前无法创建此模式,是吗?我希望Liquibase生成此模式,但如果我尝试构建数据库,它总是抛出“未找到名为xx的模式”。

s1ag04yj

s1ag04yj1#

即使Liquibase在其捆绑的变更/重构中没有CREATE SCHEMA(因此在dropwizard db dump期间不会生成CREATE SCHEMA),您仍然可以使用sql tag将其作为变更集包含在您的迁移变更日志中,如下所示:

<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;
46scxncf

46scxncf2#

不是直接回答这个问题,而是为遇到我在多个模式中创建表时遇到的错误的任何人发布。我在使用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

z2acfund

z2acfund3#

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

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

dddzy1tm4#

除了您正在使用Dropwizard这一事实之外,Spring Boot Pre-Liquibase module还能满足您的要求。
Liquibase有一个先有鸡还是先有蛋的问题,即它不能用来配置自己的先决条件,例如模式。这是Pre-Liquibase解决的问题。它在Liquibase本身之前执行一些SQL。
有时候,你会想在同一个数据库主机上托管一个应用程序的多个示例,然后你会想用模式来分隔它们,这只是Pre-Liquibase的一个可能的用例。
Pre-Liquibase是为Spring设计的,因此它不能直接用于您的Dropwizard场景。
(full披露:我是Pre-Libuibase的作者)

相关问题