【问题标题】:How to fix creation of table with reserved keywork (key)?如何使用保留关键字(键)修复表的创建?
【发布时间】:2020-02-14 04:09:39
【问题描述】:

我使用 liquibase 初始化我的 h2 数据库以进行单元测试,但是使用“key”作为列名的一个表存在问题。

我尝试将“_key”作为名称,它可以工作,但数据库(我无法更改其架构)使用“key”作为列名,所以我必须将 @Column("\"key\"") 放入我的域类。这适用于 SQL Server(生产数据库),但不适用于 h2(在内存数据库中进行测试)

在 Liquibase xml 中:(用于单元测试)

   <column name='_key' type="varchar(100)">
      <constraints nullable="true" />
   </column>

我的域名:

    @Column(name = "_key", length = 100)
    //@Column(name = "\"key\"", length = 100)
    private String key;

所以我必须取消注释第一个选项并注释第二个选项以使单元测试正常工作,并执行相反的操作以使应用程序正常工作。

使用

@Column(name = "\"key\"", length = 100)&lt;column name="key" type="varchar(100)"&gt;&lt;column name="\"key\"" type="varchar(100)"&gt;&lt;column name='"key"' type="varchar(100)"&gt;

返回错误:

架构验证:表 [displaymessages] 中缺少列 [key]

创建表的查询是:

CREATE TABLE PUBLIC.displaymessages (
  id BIGINT AUTO_INCREMENT NOT NULL,
  "'key'" VARCHAR(100),
  value VARCHAR(1000),
  type INT NOT NULL,
  createdon date NOT NULL,
  modifiedon date,
  isdeleted INT NOT NULL,
  CONSTRAINT PK_DISPLAYMESSAGES PRIMARY KEY (id)
)

【问题讨论】:

    标签: sql-server spring-boot unit-testing h2 liquibase


    【解决方案1】:

    在创建表/列的变更集上,您可以添加属性objectQuotingStrategy,其值为QUOTE_ALL_OBJECTS,如下例所示:

    <changeSet author="Sir Cuke Umber" id="1::addTable::labelA" labels="AAA" objectQuotingStrategy="QUOTE_ALL_OBJECTS">
        <createTable tableName="LABELA">
            <column name="message" type="TEXT">
                <constraints nullable="true" primaryKey="false" unique="false"/>
            </column>
        </createTable>
    </changeSet>
    

    如果您希望引用每个标识符,也可以在根更改日志级别添加此属性。

    【讨论】:

    • 感谢您的回复,我测试了您的建议,但它不起作用。测试没有找到表本身。 Schema-validation: missing table [displaymessages]
    • 数据库中表的实际名称是什么?引用的问题是许多数据库具有自动大小写更改行为,这可能会产生问题。例如,Oracle 在创建一个不带引号的名为 test 的对象时,实际上会创建一个名为 TEST 的对象(全部大写)。但是如果你用引号创建"test",实际的对象将被命名为test(小写,在create语句中指定)。如果您正在使用两个处理方式不同的平台并且对象已经存在,那么添加引号可能会导致您看到的行为。
    • 谢谢史蒂夫,我认为引用不会解决我的问题。那么让我们回到主要问题,有没有办法让 h2 保留字处理表现为 sqlserver 处理?我的意思是使用 sqlserver 加双引号有效,但 h2 无效:(
    • 没有内置的,没有。您需要编写一个插件/扩展来表达您想要的自定义功能。
    猜你喜欢
    • 2019-01-06
    • 2020-06-12
    • 1970-01-01
    • 2022-01-21
    • 2017-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-03
    相关资源
    最近更新 更多