我正在使用Dropwizard(1.0.0)和Liquibase来创建一个数据库,如果它不存在的话。
问题在于,我正在使用不同的Postgres模式(不是public)。看起来Liquibase无法在创建数据库之前创建此模式。我本以为Liquibase会生成这个模式,但每次尝试构建数据库时,它总是抛出“找不到名称为xx的模式”的错误。
我正在使用Dropwizard(1.0.0)和Liquibase来创建一个数据库,如果它不存在的话。
问题在于,我正在使用不同的Postgres模式(不是public)。看起来Liquibase无法在创建数据库之前创建此模式。我本以为Liquibase会生成这个模式,但每次尝试构建数据库时,它总是抛出“找不到名称为xx的模式”的错误。
虽然Liquibase在其捆绑的更改/重构中没有CREATE SCHEMA
(因此在dropwizard的db dump
期间不生成模式),但您仍可以使用sql
标签将其作为迁移日志中的一个changeset包含在内,方法如下:
<changeSet author="christian" id="1">
<sql dbms="postgresql" endDelimiter=";">
CREATE SCHEMA foo
</sql>
</changeSet>
请注意Liquibase将在应用任何更改集之前,在公共模式中创建自己的表:
如果您在Dropwizard中运行db migrate --dry-run
,您会发现Liquibase首先会执行
CREATE TABLE PUBLIC.DATABASECHANGELOGLOCK ...
CREATE TABLE PUBLIC.DATABASECHANGELOG ...
运行之前
CREATE SCHEMA foo;
--defaultSchemaName
参数告诉 Liquibase 使用不同的模式来创建自己的表。 - user330315db migrate --schema foo
在尝试创建Liquibase表时会失败,并显示“无效的模式名称”错误。 - fspinnenhirn这并不是直接回答问题的答案,但我发表它是为了帮助遇到和我一样在多个模式中创建表时遇到错误的人。我在使用Maven的defaultSchemaName
配置执行此操作时遇到了错误。
[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]
<defaultSchemaName>foo</defaultSchemaName>
<changelogSchemaName>foo</changelogSchemaName>
jdbc:postgresql://localhost:5432/postgres?currentSchema=foo
。Liquibase没有CREATE SCHEMA
,您需要通过运行SQL查询来管理创建模式功能。
<changeSet author="liquibase_user" id="1">
<sql>
CREATE SCHEMA IF NOT EXISTS liquibase_demo;
</sql>
</changeSet>
create schema
。 - user330315