Java Liquibase为postgres创建模式

Java Liquibase为postgres创建模式,java,postgresql,liquibase,dropwizard,Java,Postgresql,Liquibase,Dropwizard,我正在使用Dropwizard(1.0.0)和Liquibase创建一个不存在的数据库 这里的问题是我使用的是不同的Postgres模式(不是公共的)。似乎Liquibase以前无法创建此模式,是吗?我希望Liquibase生成此模式,但如果我尝试构建数据库,它总是抛出一个“未找到名为xx的模式”。即使Liquibase的捆绑更改/重构中没有CREATE schema(因此在dropwizarddb dump期间不会生成模式),您仍然可以使用将其作为变更集包含在迁移变更日志中,如下所示: <

我正在使用Dropwizard(1.0.0)和Liquibase创建一个不存在的数据库


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

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

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

创建模式foo;

不是直接回答这个问题,而是为遇到我的错误的任何人发布,在多个模式中创建表。使用
defaultSchemaName
configuration从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
福
最后,我通过将foo添加到连接字符串的末尾来解决这个问题,如下所示
jdbc:postgresql://localhost:5432/postgres?currentSchema=foo

如果您不告诉Liquibase,它不会创建任何东西。您需要在更改登录中包含一个
create schema
,我在使用liquibase(使用--schema xx)之前实际上已经创建了一个转储,并希望它重新创建schema/整个数据库。它似乎不起作用:Liquibase只运行根据更改日志中的定义生成的语句。它不会产生任何魔力,也不会猜出你丢失了什么东西。它只是一种结构化的SQL语句编写方式。它对你的垃圾一无所知是的,我知道了。但我想知道为什么liquibase dump不转储模式和数据库,而只转储表。。在我看来没有意义同样,在PostgreSQL中使用多个模式,这是一个首选方案,当您的每个应用程序都有一个单独的用户,该用户拥有(可能只有)个模式,但无法访问任何其他模式。在这种设置中,这些用户通常无权创建模式(而且,因为他们不是超级用户,所以也不能创建扩展)。这种情况是f.ex。无法使用该用户创建,并且由于在PostgreSQL中无法在连接内切换用户,因此最好先“设置”,即创建架构、扩展、,在运行liquibase之前,您可以通过
--defaultSchemaName
参数告诉liquibase为自己的表使用不同的模式。但是,模式必须先存在,才能起作用。当尝试创建Liquibase表时,等效的dropwizard命令db migrate--schema foo失败,并显示“架构名称无效”。如果我们决定对多个数据库(如SQL Server和Postgres)使用更改日志文件,这仍然有效吗???对于相同的更改,有两个部分是按dbms属性区分的???@fspinnenhirn您能告诉我们是否可以动态传递架构名称,例如CREATE schema$(schemaName)吗