Я использую базу данных 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»
Да, я уже так делаю: когда я использую application-h2.properties, это работает, но когда я использую application-mysql.properties, у меня возникает синтаксическая ошибка.
Можете ли вы поделиться ими для справки?
@SamPaulIsaac Я отредактировал описание, пожалуйста, обратитесь к нему. Или дайте мне знать, если вы ищете что-то еще.
Похоже, ошибка связана с различиями между базой данных H2 и MySQL в обработке синтаксиса SQL. Убедитесь, что сценарии SQL в каталоге db/migration совместимы как с H2, так и с MySQL. Я сомневаюсь, что проблема здесь: в MySQL нет ключевого слова DATA TYPE.
@SamPaulIsaac Да, я застрял здесь. Как мне дать запрос, совместимый для обоих. Возможно ли это? Оба имеют немного разный синтаксис.
Можете ли вы поделиться запросом (тот, который вызывает эту проблему)?
@SamPaulIsaac У меня теперь много файлов, я делюсь некоторыми, которыми поделился ссылкой Запрос
Я внес необходимые изменения здесь — rb.gy/vsp562 Похоже, проблема связана с ключевым словом «тип данных», которое не поддерживается в MySQL, вместо этого используйте «ТИП», поскольку оно совместимо для обоих.
«Сообщение: у вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, чтобы найти правильный синтаксис для использования рядом с «ТИП ТЕКСТА» в строке 1». Я попробовал ваш запрос, но получаю ту же ошибку. там есть любой параметр свойств, чтобы сделать его совместимым.
Для вашего запроса - «любой параметр свойства, чтобы сделать его совместимым» - да, мы можем, используя конфигурацию диалекта, но опять же, если вы используете сценарии миграции базы данных (Flyway/Liquibase) в папке db/migration, сценарии должны быть совместимы с целевую базу данных. Конфигурация диалекта Hibernate обрабатывает генерацию SQL для сопоставлений сущностей JPA, но не изменяет и не адаптирует напрямую необработанные сценарии SQL, расположенные в ваших папках миграции.
@SamPaulIsaac Да, я понимаю, я использую необработанный SQL-запрос, отсюда вывод: мы не можем сделать его совместимым как с MYSQL, так и с H2. верно?
Не гарантируется, что используя разные базы данных, вы сможете использовать одни и те же скрипты.
Если ваши сценарии сложны, поскольку в них активно используются расширенные функции базы данных, такие как специальные индексы, табличные пространства, типы данных, ваши сценарии наверняка не смогут быть выполнены как в H2, так и в MySql.
Учитывая, что у вас есть три способа справиться с этим:
Это невозможно. Как только запросы станут сложными, вы столкнетесь с проблемами.
Вы можете разделить их по разным папкам и указать в своих тестах использование сценариев миграции в соответствии с поставщиком базы данных. У вас может быть папка для файлов миграции MySQL в /mysql и файлов h2 в /h2.
Использование другой базы данных для ваших тестов также является плохой практикой. Я рекомендую использовать тест-контейнеры, поскольку они позволят вам запускать докер-контейнеры во время ваших тестов. Это означает, что у вас может быть экземпляр mysql, который будет запускаться при запуске теста и закрываться после его завершения, что устраняет проблему, с которой вы сталкиваетесь в данный момент. преимущество наличия значимых тестов.
1. Во время тестирования используйте application-mysql.yml для MySQL (для основного приложения) и application-h2.yml для H2, при этом общие сценарии миграции Flyway расположены в пути к классам: db/migration. 2. Активируйте соответствующий профиль (mysql или h2), используя Spring.profiles.active в вашем приложении или тестовой конфигурации.