grails应用程序的初始数据

时间:2014-10-08 20:53:26

标签: grails groovy ggts

我正在从一本书开发一个小型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,但对于我现在和我需要的地方来说,这似乎太先进了。

由于

2 个答案:

答案 0 :(得分:3)

使用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()
  }
}

很简单,不是吗?

答案 1 :(得分:3)

我建议你采用完全不同的方法。创建一个名为eg的服务 BootstrapInitialDataService ,其中一个方法名为 initData()。从该类中提取接口(我们称之为 InitialDataService )是一个很好的做法,因此您可以轻松地为开发和生产环境定义不同的组件bean。 在这个initData()方法中,您可以简单地创建所有域对象,但请记住首先检查它们是否已存在于数据库中。执行此操作时,请在Bootstrap.groovy中注入此服务并在bootstrap的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 - 这是非常强大的优势。