Как использовать общие файлы миграции для mysql и h2

Я использую базу данных h2 для тестового примера и базу данных mysql в качестве основной БД. Могу ли я поддерживать миграцию по одному пролетному пути для обоих.

Я использую структуру Springboot.

приложение-mysql.properties:

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.password=root
spring.datasource.url=jdbc:mysql://localhost:3306/shipment-planning?useSsl=true
spring.datasource.username=root

spring.flyway.default-schema=shipment-planning
spring.flyway.enabled=true

spring.jpa.hibernate.ddl-auto=none
spring.jpa.show-sql=true
spring.flyway.locations = h2/db/migration

приложение-h2.properties

spring.h2.console.enabled=true
spring.h2.console.path=/h2-console

spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE;MODE=MYSQL

spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=sa
spring.flyway.enabled=true
spring.flyway.locations = h2/db/migration

одна из синтаксических ошибок, которые я получил при запуске с Mysql.properties

«У вас ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, чтобы найти правильный синтаксис для использования рядом с «ТИП ДАННЫХ ТЕКСТ» в строке 2»

1. Во время тестирования используйте application-mysql.yml для MySQL (для основного приложения) и application-h2.yml для H2, при этом общие сценарии миграции Flyway расположены в пути к классам: db/migration. 2. Активируйте соответствующий профиль (mysql или h2), используя Spring.profiles.active в вашем приложении или тестовой конфигурации.

SamPaul Isaac 27.08.2024 12:47

Да, я уже так делаю: когда я использую application-h2.properties, это работает, но когда я использую application-mysql.properties, у меня возникает синтаксическая ошибка.

Bala Velan 27.08.2024 12:50

Можете ли вы поделиться ими для справки?

SamPaul Isaac 27.08.2024 12:55

@SamPaulIsaac Я отредактировал описание, пожалуйста, обратитесь к нему. Или дайте мне знать, если вы ищете что-то еще.

Bala Velan 27.08.2024 13:00

Похоже, ошибка связана с различиями между базой данных H2 и MySQL в обработке синтаксиса SQL. Убедитесь, что сценарии SQL в каталоге db/migration совместимы как с H2, так и с MySQL. Я сомневаюсь, что проблема здесь: в MySQL нет ключевого слова DATA TYPE.

SamPaul Isaac 27.08.2024 13:10

@SamPaulIsaac Да, я застрял здесь. Как мне дать запрос, совместимый для обоих. Возможно ли это? Оба имеют немного разный синтаксис.

Bala Velan 27.08.2024 13:19

Можете ли вы поделиться запросом (тот, который вызывает эту проблему)?

SamPaul Isaac 27.08.2024 13:20

@SamPaulIsaac У меня теперь много файлов, я делюсь некоторыми, которыми поделился ссылкой Запрос

Bala Velan 27.08.2024 13:28

Я внес необходимые изменения здесь — rb.gy/vsp562 Похоже, проблема связана с ключевым словом «тип данных», которое не поддерживается в MySQL, вместо этого используйте «ТИП», поскольку оно совместимо для обоих.

SamPaul Isaac 27.08.2024 13:39

«Сообщение: у вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, чтобы найти правильный синтаксис для использования рядом с «ТИП ТЕКСТА» в строке 1». Я попробовал ваш запрос, но получаю ту же ошибку. там есть любой параметр свойств, чтобы сделать его совместимым.

Bala Velan 27.08.2024 13:45

Для вашего запроса - «любой параметр свойства, чтобы сделать его совместимым» - да, мы можем, используя конфигурацию диалекта, но опять же, если вы используете сценарии миграции базы данных (Flyway/Liquibase) в папке db/migration, сценарии должны быть совместимы с целевую базу данных. Конфигурация диалекта Hibernate обрабатывает генерацию SQL для сопоставлений сущностей JPA, но не изменяет и не адаптирует напрямую необработанные сценарии SQL, расположенные в ваших папках миграции.

SamPaul Isaac 27.08.2024 13:59

@SamPaulIsaac Да, я понимаю, я использую необработанный SQL-запрос, отсюда вывод: мы не можем сделать его совместимым как с MYSQL, так и с H2. верно?

Bala Velan 27.08.2024 14:13
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
12
50
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Не гарантируется, что используя разные базы данных, вы сможете использовать одни и те же скрипты.

Если ваши сценарии сложны, поскольку в них активно используются расширенные функции базы данных, такие как специальные индексы, табличные пространства, типы данных, ваши сценарии наверняка не смогут быть выполнены как в H2, так и в MySql.

Учитывая, что у вас есть три способа справиться с этим:

  • создайте очень простые скрипты, не использующие какие-либо особенности базы данных, в одном каталоге и проверьте, что они могут работать с обеими базами данных.
  • создайте два каталога (один для H2 и один для MySql) и продублируйте скрипты, адаптируя их для каждой базы данных.
  • смешайте два решения, имеющие общие каталоги для сценариев, которые могут выполняться в обеих базах данных, и один каталог для каждой базы данных, со сценариями, которые используют расширенные функции этой базы данных и которые не могут использоваться совместно.

Это невозможно. Как только запросы станут сложными, вы столкнетесь с проблемами.

Вы можете разделить их по разным папкам и указать в своих тестах использование сценариев миграции в соответствии с поставщиком базы данных. У вас может быть папка для файлов миграции MySQL в /mysql и файлов h2 в /h2.

Использование другой базы данных для ваших тестов также является плохой практикой. Я рекомендую использовать тест-контейнеры, поскольку они позволят вам запускать докер-контейнеры во время ваших тестов. Это означает, что у вас может быть экземпляр mysql, который будет запускаться при запуске теста и закрываться после его завершения, что устраняет проблему, с которой вы сталкиваетесь в данный момент. преимущество наличия значимых тестов.

Другие вопросы по теме