Каков хороший рабочий процесс для миграции базы данных в Grails?

Я хочу использовать подключаемый модуль Grails database-migration для миграции базы данных. Когда я запускаю приложение Grails в первый раз, все таблицы базы данных создаются автоматически. Производственная настройка в моем DataSource.groovy:

production {


    dataSource {
        dbCreate = "update"
        url = "jdbc:mysql://localhost/myapp?useUnicode=yes&characterEncoding=UTF-8"
        username = "test"
        password = "test"
        dialect = org.hibernate.dialect.MySQL5InnoDBDialect
        properties {
           validationQuery = "select 1"
           testWhileIdle = true
           timeBetweenEvictionRunsMillis = 60000
        }
    }
}

В моем config.groovy я установил:

grails.plugin.databasemigration.updateOnStart = true
grails.plugin.databasemigration.updateOnStartFileNames = ['changelog.groovy']

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


person confile    schedule 21.12.2012    source источник


Ответы (4)


Как вы, наверное, знаете, директива dbcreate не рекомендуется для рабочей среды. использовать:

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

Так что имейте в виду, что вам нужно будет удалить это (или установить 'none').


Начальный базовый рабочий процесс

  1. Определить текущее состояние
  2. Создать базу данных из журнала изменений или отметить как актуальную
  3. Установить параметры конфигурации

Первый шаг — заставить changelog отражать текущее состояние. Если у вас есть существующая база данных, вы хотите использовать ее для определения базовой линии. В противном случае используйте GORM для определения таблиц.

Эти команды создадут базовый уровень для вашей базы данных. Также я выбираю формат Groovy DSL, а не Liquibase XML, потому что удобочитаемость.

Существующая база данных

Если у вас уже есть рабочая база данных с данными, это немного сложно. Вам потребуется доступ к базе данных или ее копии из среды Grails. Если вы манипулируете копией, вам нужно будет применить обновления обратно к вашей рабочей среде (и, возможно, управлять ею как запланированным отключением).

Команда:

grails [environment] dbm-generate-changelog changelog.groovy

... где environment необязательно указывает среду dev/test/prod/custom, в которой определена база данных.

После этого пометьте базу данных как «актуальную» в отношении журнала изменений:

grails [environment] dbm-changelog-sync

Затем повторно примените базу данных к рабочей среде, если это необходимо.

Новая база данных

Если у вас нет существующей базы данных (или вам все равно):

grails dbm-generate-gorm-changelog changelog.groovy

Затем, чтобы создать базу данных из журнала изменений:

grails [environment] dbm-update

Конфигурация

Вы уже правильно установили параметры:

grails.plugin.databasemigration.updateOnStart = true
grails.plugin.databasemigration.updateOnStartFileNames = ['changelog.groovy']

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


Рабочий процесс разработки

  1. Внесите изменения в домены
  2. Создать журнал изменений, выявляющий различия
  3. (Резервное копирование и) обновление базы данных

Итак, теперь у вас есть актуальная база данных, и вы вносите изменения в классы предметной области, добавляя новые и изменяя свойства проверки.

Каждый раз, когда вы хотите записать свои изменения, вы хотите сравнить свои классы GORM с тем, что существует в базе данных, и создать новый файл журнала изменений, чтобы записать разницу:

grails [environment] dbm-gorm-diff [meaningful name].groovy --add

Здесь environment — это база данных, с которой вы сравниваете, а meaningful name должно каким-то образом отражать применяемое изменение (возможно, ключ задачи JIRA, номер версии или описание).

Флаг --add вставит оператор include в changelog.groovy.

Если вы настроили updateOnStart, то все готово! В противном случае, чтобы вручную обработать обновление, повторно используйте команду:

grails [environment] dbm-update

РТФМ

  • Документация по плагинам — Начало работы
  • Документация по подключаемым модулям — Общее использование
  • Ответ Confile выше указывает на хороший учебник, в котором подробно рассказывается о ручных изменениях в журналы изменений
  • Документация Liquibase — наборы изменений (использует формат XML, но полезен для понимания концепций)
person brasskazoo    schedule 03.12.2014

Подход, который я бы использовал, заключается в переносе каждой таблицы в домен Grails с правильно настроенным сопоставлением (очень важно!).

Затем оставьте Grails для создания базы данных в первый раз, а затем заполните ее предыдущей резервной копией базы данных, которую вы хотите перенести.

После этого установите конфигурацию Grails для обновления базы данных при каждом ее запуске.

Я знаю, это кажется немного грязным, но если бы мне пришлось это сделать, я бы сделал это так.

Надеюсь, поможет :)

person axierjhtjz    schedule 21.12.2012

Я нашел очень хороший учебник, в котором объясняется решение моей проблемы:

Учебное пособие по миграции базы данных Grails

person confile    schedule 21.12.2012
comment
Предоставьте здесь краткое изложение руководства, чтобы, если ссылка перестанет работать, решение по-прежнему было доступно здесь. - person Dmitry Pashkevich; 05.10.2013

Рабочий процесс состоит из следующих шагов:

1) Установите плагин с помощью команды grails install-plugin database-migration

2) После настройки плагина выполните команду:

grails dbm-generate-gorm-changelog changelog.groovy or changelog.xml

По умолчанию он создает файл в папке grails-app/migrations/changelog.groovy или .xml.

3) установить dataSource dbcreate='none'

3) Теперь беги

grails dbm-changelog-sync

это создаст имя таблицы databasechangelog и вставит записи в соответствии с вашей существующей схемой.

Вот и все.

person Anuj Aneja    schedule 09.10.2013