2

我正在从一本书中开发一个小型 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:我已经看到了这个问题Seed data for grails application但对于我现在所处的位置和我需要的东西来说似乎太先进了。

谢谢

4

2 回答 2

3

我会建议你完全不同的方法。使用一种名为initData()的方法创建一个名为BootstrapInitialDataService的服务。从该类中提取一个接口(我们称之为InitialDataService)是一种很好的做法,这样您就可以轻松地为您的开发和生产环境定义不同的组件 bean。在这个 initData() 方法中,您可以简单地创建所有域对象,但请记住首先检查它们是否已经存在于数据库中。执行此操作时,将此服务注入 Bootstrap.groovy 并在引导程序的 init 闭包中运行 initData():

class Bootstrap {

def initialDataService

def init = {

    initialDataService.initData()
}

在 resources.groovy 文件中,您可以显式定义您的 initialDataService bean:

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

    initialDataService(your.package.BootstrapInitialDataService)
}

感谢当您决定更改初始化数据引导逻辑时,您只需定义一个新 bean 并替换 resources.groovy 中的定义 - 其余部分保持不变。您甚至可以使用环境开关在不同的环境中注入不同的 bean - 这是非常强大的优势。

于 2014-10-09T05:44:27.730 回答
3

insert准备一个带有您需要的 -statements的 SQL 文件并在以下位置运行它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()
  }
}

很简单,不是吗?

于 2014-10-08T21:57:45.277 回答