Исходные данные для приложения Grails

Я разрабатываю небольшое приложение Grails из книги, и один из шагов, который ему нужен, — это ввести в базу данных исходные данные. Когда я делаю это с помощью GroovyConsole, сценарий выполняется, но не сохраняет данные.

DataSource.groovy настройки среды следующие

development {
        dataSource {
            dbCreate = "update" // one of 'create', 'create-drop', 'update', 'validate', ''
            url = "jdbc:h2:devDb;MVCC=TRUE;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE"
        }
    }

Когда я запускаю скрипт в консоли, result возвращает NULL. Я использовал GGTS для приложения, но понятия не имею, как сохранить исходные данные из GGTS, поэтому для этого я запустил команду grails console из командной строки. Это правильный путь? Есть ли способ сделать это напрямую из GGTS?

PS: я видел этот вопрос Исходные данные для приложения grails, но он кажется слишком продвинутый для того, где я сейчас и что мне нужно.

Спасибо


person NanoNi    schedule 08.10.2014    source источник


Ответы (2)


подготовьте файл SQL с нужными вам insert-операторами и запустите его в BootStrap.groovy:

class BootStrap {

  def dataSource 

  def init = { servletContext ->
    Sql sql = new Sql( dataSource )
    new File( pathToSql ).eachLine{ sql.executeInsert it }
    sql.commit()
    sql.close()
  }
}

достаточно просто, не так ли?

person injecteer    schedule 08.10.2014

Я бы предложил вам совсем другой подход. Создайте службу с именем, например. BootstrapInitialDataService с одним методом initData(). Хорошей практикой является извлечение интерфейса из этого класса (назовем его InitialDataService), чтобы вы могли легко определить различные bean-компоненты для вашей среды разработки и рабочей среды. В этом методе initData() вы можете просто создать все свои объекты домена, но не забудьте сначала проверить, существуют ли они уже в базе данных. Когда вы сделаете это, внедрите эту службу в Bootstrap.groovy и запустите initData() в закрытии инициализации начальной загрузки:

class Bootstrap {

def initialDataService

def init = {

    initialDataService.initData()
}

В файле resources.groovy вы можете явно определить свой bean-компонент initialDataService:

beans = {
    //.... other beans definition goes here

    initialDataService(your.package.BootstrapInitialDataService)
}

Спасибо, что когда вы решите изменить логику начальной загрузки данных инициализации, вы просто определите новый bean-компонент и замените определение в resources.groovy - остальное останется прежним. Вы даже можете использовать переключатель среды для внедрения разных bean-компонентов в разные среды — это очень важное преимущество.

person Szymon Stepniak    schedule 09.10.2014