grails应用程序的初始数据

grails应用程序的初始数据,grails,groovy,ggts,Grails,Groovy,Ggts,我正在根据一本书开发一个小型grails应用程序,它需要的步骤之一是向数据库提供初始数据。当我使用GroovyConsole执行此操作时,脚本会执行,但不会持久化数据 DataSource.groovy环境设置如下 development { dataSource { dbCreate = "update" // one of 'create', 'create-drop', 'update', 'validate', '' url

我正在根据一本书开发一个小型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完成

附言:我见过这个问题,但对于我现在的位置和我需要的东西来说,它似乎太先进了


谢谢

准备一个包含所需的
insert
-语句的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()
  }
}

很简单,不是吗?

我建议您采用完全不同的方法。使用名为initData()的方法创建一个名为bootstrapininitialdataservice的服务。从该类中提取接口(我们称之为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)
}
感谢您,当您决定更改init数据引导逻辑时,只需定义一个新bean并替换resources.groovy中的定义,其余的保持不变。您甚至可以使用环境开关在不同的环境中注入不同的bean——这是非常强大的优势