在 postgres 中使用 liquibase 制作不区分大小写的表

Posted

技术标签:

【中文标题】在 postgres 中使用 liquibase 制作不区分大小写的表【英文标题】:Making case insensitive table with liquibase in postgres 【发布时间】:2010-06-08 09:11:09 【问题描述】:

是否有人知道如何使用 liquibase 制作不区分大小写的表格。我正在使用最新的 postgres。 例如 liquibase 以这种方式创建表:

创建表“用户”(
  "userId" 整数唯一不为空,
  “userFirstName” varchar(50) 不为空,
  “userLastName” varchar(50) 不为空
);

但是如何使 liquibase 以这种方式创建表:

创建表用户(
  userId 整数唯一不为空,
  userFirstName varchar(50) 不为空,
  userLastName varchar(50) 不为空
);

【问题讨论】:

好像是***.com/questions/22616545/…的反问题 【参考方案1】:

如果 liquibase 未生成您想要的内容,您始终可以使用该标签指定您想要执行的确切 SQL。

默认的 postgres 支持始终在表名和列名周围使用引号,因此使用保留字作为对象名不会有问题。您可以通过创建自己的 liquibase.database.core.PostgresDatabase 子类并让 liquibase 使用您的类来覆盖它。有一个 escapeDatabaseObject(String) 方法,它传入原始字符串并返回引用的值。您只需要重写此方法即可返回未触及的原始字符串。

您使用数据库的方式取决于您的 liquibase 版本。如果您使用即将发布的 2.0 版本 (http://liquibase.org/ci/latest) 的快照,您只需将类保存在 liquibase.database.ext 包中。如果您使用的是 1.9,则应该有一个 databaseClassName 参数可以用来告诉 liquibase 您的类。

【讨论】:

我使用的是 liquibase 1.9,但这对我来说已经足够了。谢谢。【参考方案2】:

Liquibase 3.0 开始,databaseChangeLog 有一个属性 objectQuotingStrategy。默认为LEGACY,但可以更改为QUOTE_ONLY_RESERVED_WORDS,这主要是为了使更改日志变得不区分PostgreSQL:

<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
        http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.0.xsd" 
        objectQuotingStrategy="QUOTE_ONLY_RESERVED_WORDS">

该属性也可用于特定的changeSet,但我不确定,因为它可能会更改更改集的校验和。当然,您也可以将其与YAML config 一起使用。

About PostgreSQL Case Sensitivity 中解释了 PostgreSQL 行为。

【讨论】:

以上是关于在 postgres 中使用 liquibase 制作不区分大小写的表的主要内容,如果未能解决你的问题,请参考以下文章

Liquibase / Spring Boot / Postgres - 模式名称不起作用

必须在 Liquibase 上指定 changeLogFile 错误

如何将mm:ss时间字符串转换为秒整数(postgres / liquibase)

数据库更改日志表未在 Liquibase 的 Postgres 环境中创建

Liquibase:关系“databasechangeloglock”已经存在,使用 grails 插件和非默认模式

自动回滚不适用于 Postgresql 上的 liquibase