返回

Liquibase + Spring:指定架构时解决关系不存在错误指南

java

Liquibase + Spring:指定 liquibase-schemadefault-schema 时解决关系不存在错误

当在 Liquibase 和 Spring Boot 中指定 liquibase-schemadefault-schema 属性时,可能会遇到 "关系 xxx.databasechangeloglock 不存在" 的错误。以下指南将详细介绍此错误的原因和解决方法。

问题概述

在 Liquibase 中,liquibase-schema 属性指定 Liquibase 创建表和元数据的架构,而 default-schema 属性指定应用程序操作的默认架构。当未指定这两个属性时,Liquibase 会在默认架构中执行所有操作。

但是,当指定 liquibase-schema 属性时,Liquibase 会尝试在指定架构中创建表。如果该架构不存在,就会出现 "关系 xxx.databasechangeloglock 不存在" 的错误,因为 Liquibase 无法找到用于跟踪变更集执行的表。

解决方法

解决此错误有两种方法:

创建不存在的架构

在指定 liquibase-schema 属性之前,创建指定架构。这可以通过使用 SQL 语句或使用数据库管理工具来完成。

liquibase-schema 属性设置为默认架构

也可以将 liquibase-schema 属性设置为与 default-schema 属性相同的值。这将导致 Liquibase 在默认架构中创建表,从而避免错误。

示例代码

以下示例代码展示了如何通过将 liquibase-schema 属性设置为 public(默认架构)来解决错误:

spring.liquibase.liquibase-schema=public
spring.liquibase.default-schema=public

结论

指定 liquibase-schemadefault-schema 属性时,如果不存在指定架构或 liquibase-schema 属性未设置为与 default-schema 属性相同的值,就会出现 "关系 xxx.databasechangeloglock 不存在" 的错误。通过遵循上述解决方案,可以解决此错误并成功使用 Liquibase 和 Spring Boot。

常见问题解答

1. 为什么在不指定 liquibase-schemadefault-schema 属性时不会出现此错误?
在不指定这些属性时,Liquibase 会在默认架构中执行所有操作,因此不会尝试在不存在的架构中创建表。

2. 如果我不想创建不存在的架构,我可以使用哪种方法?
你可以将 liquibase-schema 属性设置为与 default-schema 属性相同的值。

3. 为什么在创建不存在的架构后仍会出现此错误?
请确保你具有在指定架构中创建表的权限。

4. 我可以通过其他方式来解决此错误吗?
可以,你可以通过手动创建 databasechangeloglock 表来解决此错误,但这通常不推荐使用。

5. 我在使用 Liquibase 时遇到了其他错误,怎么办?
请参阅 Liquibase 文档或在 Stack Overflow 等社区论坛上寻求帮助。