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应用程序的种子数据,但对于我现在的处境和我需要的东西来说,它似乎太先进了。

感谢

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

很简单,不是吗?

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

class Bootstrap {
def initialDataService
def init = {
    initialDataService.initData()
}

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

beans = {
    //.... other beans definition goes here
    initialDataService(your.package.BootstrapInitialDataService)
}

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

您只需在BootStrap.groovy中添加以下代码{project}/grails-app/init/{project}/BootStrap.groovy

例如:


class BootStrap {
    def init = { servletContext ->
        // create a driver a save it in db
        def user = new User(name: "juan")
        driver.save()
    }
    def destroy = {
    }
}

相关内容

  • 没有找到相关文章

最新更新