groovy Grails应用程序的初始数据

kuarbcqp  于 2022-11-01  发布在  其他
关注(0)|答案(3)|浏览(156)

我正在根据一本书开发一个小的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,但它似乎太先进了,我现在在哪里,我需要什么。
谢谢

oalqel3c

oalqel3c1#

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

很简单,不是吗

h5qlskok

h5qlskok2#

我建议您使用完全不同的方法。创建一个名为BootstrapInitialDataService的服务,并使用一个名为initData的方法().从该类中提取接口是一种很好的做法(让我们称之为InitialDataService),这样您就可以轻松地为您的开发和生产环境定义不同的组件bean。()方法,您可以简单地创建所有的域对象,但是记住首先要检查它们是否已经存在于数据库中。当您这样做时,将这个服务注入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)
}

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

qncylg1j

qncylg1j3#

您可以在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 = {
    }
}

相关问题