Spring Boot中Liquibase创建Postgres表自带引号,如何无引号建表
Liquibase 连接 PostgreSQL 建表自动带双引号的处理方法
根因说明
PostgreSQL 的语法规则里,没有被双引号包裹的标识符(表名、列名)会被自动转换为小写格式存储。Liquibase 为了保留你在配置里写的驼峰式名称大小写,会自动给这类混合大小写的表名包裹双引号,否则生成的SQL执行后Postgres会把表名转成全小写,和Liquibase内部记录的元数据不匹配。
具体解决方案
1. 调整表名命名格式为全小写下划线(推荐,符合Postgres最佳实践)
直接修改你的建表changeSet中的tableName配置,把大小写混合的LabelEntity替换为全小写、下划线分隔的命名,完全去掉大小写混合的字段:
# create-label_entity-table.yml 修改后的核心片段 changes: - createTable: tableName: label_entity columns: - column: name: id type: serial autoIncrement: true constraints: primaryKey: true nullable: false # 其余列配置完全保持原有逻辑即可
修改后Liquibase生成的建表语句不会自动添加双引号,后续查询直接写SELECT * FROM public.label_entity即可正常执行,没有大小写匹配问题。
2. 全局修改Liquibase的标识符引用策略
如果不想修改原有驼峰命名的表名,可以在主changelog配置文件最开头,全局关闭Liquibase自动给非全小写标识符加双引号的逻辑:
# db.changelog-master.yml 修改后的配置 databaseChangeLog: # 新增全局属性,使用传统的标识符引用策略,不自动加引号 - property: name: identifierQuotingStrategy value: LEGACY # 原有include配置保持不变 - include: file: db/liquibase/create-label_entity-table.yml
配置生效后,即使你在changeSet里写了驼峰式表名,Liquibase生成的SQL也不会自动包裹双引号,Postgres会自动把表名转成小写存储,后续查询也不需要加双引号。
注意事项
如果数据库里已经存在之前创建的、带双引号的
"LabelEntity"表,修改配置后需要先手动删除该旧表,同时清理DATABASECHANGELOG元数据表中对应已执行的changeSet记录,再重启应用让Liquibase重新执行建表流程,否则会触发表已存在的报错。
内容的提问来源于stack exchange,提问作者Zaur Farrukzada
相关产品推荐
相关产品推荐

