Как исправить создание таблицы с зарезервированной клавиатурой (ключом)? - PullRequest
0 голосов
/ 17 октября 2019

Я использую liquibase для инициализации своей базы данных h2 для модульного тестирования, но есть проблема с одной таблицей, использующей «ключ» в качестве имени столбца.

Я пробовал «_key» в качестве имени, оно работает, ноБаза данных (которую я не могу изменить в своей схеме) использует «ключ» в качестве имени столбца, поэтому я должен поместить @Column ("\" ключ \ "") в мой класс домена. Это работает для 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) с <column name="key" type="varchar(100)"> или <column name="\"key\"" type="varchar(100)"> или <column name='"key"' type="varchar(100)">

возвращает ошибку:

Проверка схемы: отсутствует столбец [ключ] в таблице [displaymessages]

и запрос, который создает таблицу:

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)
)

Ответы [ 2 ]

1 голос
/ 17 октября 2019

Это прекрасно работает

create table testr
(
[key] varchar(10)
)   

Поместите имя столбца в скобки, как показано во фрагменте.

Подробнее о Зарезервированные ключевые слова (Transact-SQL)

0 голосов
/ 17 октября 2019

В набор изменений, который создает таблицу / столбец, вы можете добавить атрибут 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>

Этот атрибут также можно добавитьна уровне корневых изменений, если вы хотите, чтобы каждый идентификатор был заключен в кавычки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...