Экспортированная метка времени меняет значение после загрузки обратно в БД - PullRequest
0 голосов
/ 29 июня 2018

Мой сценарий - экспортировать данные из реальной DB2 и затем загрузить их обратно для целей интеграционных тестов. Я использую liquibase (v3.5.3) для управления им.

Я обнаружил, что значения TIMESTAMP изменяются в течение этого цикла. Когда значение метки времени экспортируется, я вижу его в файле изменений как «2018-06-28 22: 47: 38.816343». После этого, когда я загружаю его обратно в DB2, он становится «2018-06-28 23: 01: 14.343».

Причина в том, что часть "816343" обрабатывается не как часть секунды, а как количество миллисекунд, и эта сумма добавляется к метке времени результата.

В тестах критерии делового решения принимаются путем сравнения этих временных меток. Мне нужно, чтобы они были равны.

Любые мысли и предложения будут оценены.

Есть шаги для воспроизведения:

1. Создайте файл "01_test_data_to_setup.xml" с содержимым

<code> <?xml version="1.1" encoding="UTF-8" standalone="no"?> <databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.5.xsd"> <changeSet author="OK" id="1"> <createTable tableName="TT"> <column name="TS_LOADED" type="TIMESTAMP"/> <column name="TS_GENERATED" type="TIMESTAMP" defaultValueComputed="CURRENT_TIMESTAMP"> <constraints nullable="false"/> </column> </createTable> </changeSet> <changeSet author="OK" id="2"> <insert tableName="TT"> <column name="TS_LOADED"/> </insert> </changeSet> </databaseChangeLog>

2. Выполните указанный выше файл журнала изменений с помощью команды обновления liquibase

liquibase.bat --driver = com.ibm.db2.jcc.DB2Driver --logLevel = info --classpath = ~ путь к драйверу jdbc здесь ~ --changeLogFile = 01_test_data_to_setup.xml --url = jdbc: db2: ~ URL jdbc здесь ~ --defaultSchemaName = ~ имя схемы здесь ~ --username = ~ имя пользователя здесь ~ --password = ~ пароль здесь ~ update

3. Экспорт данных из БД

liquibase.bat --driver = com.ibm.db2.jcc.DB2Driver --logLevel = info --classpath = ~ путь к драйверу jdbc здесь ~ --changeLogFile = db2_exported_test_data.xml --url = jdbc: db2: ~ URL-адрес jdbc здесь ~ --defaultSchemaName = ~ имя схемы здесь ~ --username = ~ имя пользователя здесь ~ --password = ~ пароль здесь ~ --diffTypes = "data" generateChangeLog --includeObjects = "table: TT"

В результате у вас будет файл "db2_exported_test_data.xml"

<code> <?xml version="1.1" encoding="UTF-8" standalone="no"?> <databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.5.xsd"> <changeSet author="OK (generated)" id="1530226079041-1"> <insert tableName="TT"> <column name="TS_LOADED"/> <column name="TS_GENERATED" valueDate=~your generated timestamp value here. in my case it's "2018-06-28 22:47:38.816343"/> </insert> </changeSet> </databaseChangeLog>

4. Файл для загрузки экспортированной метки времени обратно в БД "02_test_data_to_load.xml"

<code> <?xml version="1.1" encoding="UTF-8" standalone="no"?> <databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.5.xsd"> <changeSet author="OK" id="3"> <insert tableName="TT"> <column name="TS_LOADED" valueDate=~value in TS_GENERATED from previous step, i.e."2018-06-28 22:47:38.816343"~/> </insert> </changeSet> </databaseChangeLog>

Команда Liquibase

liquibase.bat --driver = com.ibm.db2.jcc.DB2Driver --logLevel = info --classpath = ~ путь к драйверу jdbc здесь ~ --changeLogFile = 02_test_data_to_load.xml --url = jdbc: db2: ~ URL-адрес jdbc здесь ~ --defaultSchemaName = ~ имя схемы здесь ~ --username = ~ имя пользователя здесь ~ --password = ~ пароль здесь ~ update

5. Проверьте экспортированную и загруженную временную метку в БД или еще раз экспортируйте данные таблицы TT.

Значение временной метки TS_LOADED во второй строке будет отличаться от значения TS_GENERATED в первой строке

1 Ответ

0 голосов
/ 03 июля 2018

Я думаю, это ошибка в Liquibase, похожая на эту https://liquibase.jira.com/browse/CORE-1958

Или ваш тип данных - TIMESTAMP (3) на целевой таблице

...