Мой сценарий - экспортировать данные из реальной 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 в первой строке