You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Liquibase和PostgreSQL创建不带引号的表名?

解决Liquibase创建PostgreSQL表时自动加引号的问题

我之前也碰到过类似的困扰,其实核心是PostgreSQL和Liquibase对标识符大小写的处理逻辑在起作用,给你几个可行的解决方案:

方案一:将表名改为全小写(最直接的解决方式)

PostgreSQL默认会把未加引号的标识符转为小写,而Liquibase只有当标识符包含大写字母、特殊字符或者是保留字时,才会自动给它加引号。所以如果把表名改成全小写,Liquibase就不会给它加引号了,最终创建的表就是public.free_me_from_the_quotes,访问的时候直接写表名即可,完全不需要引号。

示例变更脚本:

<createTable tableName="free_me_from_the_quotes">
  <column name="ID" type="NUMERIC">
    <constraints nullable="false" primaryKey="true"/>
  </column>
  <!-- 其他列定义 -->
</createTable>

方案二:正确配置Liquibase的objectQuotingStrategy参数

如果你坚持要用大写的表名,但只是不想让Liquibase加引号(注意:这样PostgreSQL会自动把表名转为小写,最终表名还是public.free_me_from_the_quotes),可以调整objectQuotingStrategy的配置:

方式1:在全局配置文件(liquibase.properties)中设置

liquibase.objectQuotingStrategy=QUOTE_ONLY_RESERVED_WORDS

方式2:在单个changeSet中指定

<changeSet id="create-free-table" author="your-name">
  <createTable tableName="FREE_ME_FROM_THE_QUOTES" objectQuotingStrategy="QUOTE_ONLY_RESERVED_WORDS">
    <column name="ID" type="NUMERIC">
      <constraints nullable="false" primaryKey="true"/>
    </column>
    <!-- 其他列定义 -->
  </createTable>
</changeSet>

这个配置的作用是:只有当标识符是PostgreSQL的保留字时,Liquibase才会给它加引号,普通的大写标识符不会被加引号,最终会被PostgreSQL转为小写存储。

方案三:如果确实需要保留大写表名(接受带引号的标识符)

如果你的需求是数据库里的表名必须是大写的FREE_ME_FROM_THE_QUOTES,那Liquibase自动加引号其实是正确的——因为PostgreSQL只有通过加引号的标识符才能保留大小写。这种情况下,你访问表的时候必须用引号,比如执行SELECT * FROM public."FREE_ME_FROM_THE_QUOTES";,这是PostgreSQL的原生特性,和Liquibase无关。

内容的提问来源于stack exchange,提问作者Pampa Nello

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:22:09