2014-10-08 138 views
2

我正在开发一本书的小型grails应用程序,它需要的一个步骤是向数据库提供初始数据。当我这样做使用GroovyConsole时,脚本执行但不保留数据。grails应用程序的初始数据

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,但它似乎太先进,我现在和我需要的地方。

感谢

回答

3

准备与你需要的,在BootStrap.groovy运行的insert -statements SQL文件:

class BootStrap { 

    def dataSource 

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

是很简单,不是吗?

3

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

class Bootstrap { 

def initialDataService 

def init = { 

    initialDataService.initData() 
} 

在resources.groovy文件,你可以明确地定义你的initialDataService豆:

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

    initialDataService(your.package.BootstrapInitialDataService) 
} 

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

相关问题