Liquibase为postgres创建Schema

Chr*_*ian 7 java postgresql liquibase dropwizard

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

这里的问题是我使用的是不同的Postgres模式(不公开).看起来Liquibase以前不能创建这个架构了吗?我期待Liquibase生成这个模式,但如果我尝试构建数据库,它总是会抛出"找不到名称xx的模式".

fsp*_*irn 8

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

<changeSet author="christian" id="1">
    <sql dbms="postgresql" endDelimiter=";">
        CREATE SCHEMA foo
    </sql>
</changeSet>
Run Code Online (Sandbox Code Playgroud)

请注意,在应用任何变更集之前,Liquibase都会 PUBLIC 模式中创建它自己的
如果db migrate --dry-run在dropwizard中运行,您会看到Liquibase将首先执行

<changeSet author="christian" id="1">
    <sql dbms="postgresql" endDelimiter=";">
        CREATE SCHEMA foo
    </sql>
</changeSet>
Run Code Online (Sandbox Code Playgroud)

跑步前

CREATE TABLE PUBLIC.DATABASECHANGELOGLOCK ...
CREATE TABLE PUBLIC.DATABASECHANGELOG ...
Run Code Online (Sandbox Code Playgroud)

  • 但是,该模式必须首先存在,然后才能起作用。尝试创建Liquibase表时,等效的dropwizard命令`db migration --schema foo`失败,并带有_“无效的架构名称” _ (3认同)
  • 您可以通过`--defaultSchemaName`参数告诉Liquibase对自己的表使用不同的模式。 (2认同)

Mau*_*iya 6

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

<changeSet author="liquibase_user" id="1">
    <sql>
        CREATE SCHEMA IF NOT EXISTS liquibase_demo;
    </sql>
</changeSet>
Run Code Online (Sandbox Code Playgroud)


Abe*_*Abe 5

不是直接回答这个问题,而是将其发布给遇到我错误的任何人,并在多个模式中创建表。我在使用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]
Run Code Online (Sandbox Code Playgroud)

我试图通过在pom.xml中添加以下配置来解决此问题,但这只是部分解决方案:

<defaultSchemaName>foo</defaultSchemaName>
<changelogSchemaName>foo</changelogSchemaName>
Run Code Online (Sandbox Code Playgroud)

最后,我也通过在连接字符串的末尾添加foo来解决此问题,如下所示 jdbc:postgresql://localhost:5432/postgres?currentSchema=foo