Подход к обновлению наборов изменений в жидкости - PullRequest
0 голосов
/ 05 февраля 2020

У меня есть ситуация, когда в предыдущем выпуске у меня было 0 сеяных значений в table1 с использованием сценария liquibase. Моим первичным ключом была последовательность в java, и значения начинались с 100000.

Это продолжалось в течение нескольких выпусков.

Теперь, в последующем выпуске, внезапно возникнет необходимость занести некоторые (например, 10) значения в таблицу table1. В качестве процесса переноса даты могут быть некоторые (с помощью приложения) вставленные вручную значения в таблицу table1. Чтобы первичные ключи не конфликтовали с уже существующими ключами, я планирую начинать идентификаторы с 1 до 10, поскольку последовательность начинается с 10000 и никогда не будет иметь значения меньше 100000.

У меня есть возможность написание альтернативного сценария с использованием двух подходов:

Код подхода 1 выглядит следующим образом:

- changeSet:
    id: ID-1
    author: demo
    preConditions:
      onFail: MARK_RAN
      sqlCheck:
        expectedResult: 0
        sql: select count(*) from ${schema}.table1 where column_1 >= 1 and column_1 <= 10;
    changes:
    - sql:
      dbms: PostgreSQL
      splitStatements: true
      stripComments: true
      sql: INSERT INTO ${schema}.table1 (column_1, column_2) VALUES(1, 'text1');
           INSERT INTO ${schema}.table1 (column_1, column_2) VALUES(2, 'text2');
        .....
           INSERT INTO ${schema}.table1 (column_1, column_2) VALUES(10, 'text10');

Код подхода 2 выглядит следующим образом:

- changeSet:
    id: ID-1
    author: demo
    preConditions:
      onFail: MARK_RAN
      sqlCheck:
        expectedResult: 0
        sql: select count(*) from ${schema}.table1 where column_1 = 1 
    changes:
    - sql:
      dbms: PostgreSQL
      splitStatements: true
      stripComments: true
      sql: INSERT INTO ${schema}.table1 (column_1, column_2) VALUES(1, 'text1');

- changeSet:
    id: ID-2
    author: demo
    preConditions:
      onFail: MARK_RAN
      sqlCheck:
        expectedResult: 0
        sql: select count(*) from ${schema}.table1 where column_1 = 2
    changes:
    - sql:
      dbms: PostgreSQL
      splitStatements: true
      stripComments: true
      sql: INSERT INTO ${schema}.table1 (column_1, column_2) VALUES(2, 'text2');

---- 

- changeSet:
    id: ID-10
    author: demo
    preConditions:
      onFail: MARK_RAN
      sqlCheck:
        expectedResult: 0
        sql: select count(*) from ${schema}.table1 where column_1 = 10
    changes:
    - sql:
      dbms: PostgreSQL
      splitStatements: true
      stripComments: true
      sql: INSERT INTO ${schema}.table1 (column_1, column_2) VALUES(10, 'text10');

Я из Мы решили использовать подход № 1, так как есть меньшие проверки, но сначала хотели подтвердить, так как изменение кода напрямую go попадет в среду клиента, а будущие изменения вышеупомянутой логики c приведут к ошибкам контрольной суммы.

1 Ответ

1 голос
/ 05 февраля 2020

Если вам нужны все 10 строк данных или ничего, и если вы уверены, что select count(*) from ${schema}.table1 where column_1 >= 1 and column_1 <= 10; действительно вернет 0, то go при первом подходе.

В противном случае, я бы go со вторым подходом.

Я бы не стал беспокоиться об ошибках контрольной суммы, поскольку вы должны сделать идентификаторы changeSet уникальными.

Кроме того, на мой взгляд, подход, когда обычно последовательность идентификаторов начинается с 10000, но в в некоторых крайних случаях (например, в этом) он начинается с 1, не очень хороший и надежный.

...