Grails:使用run脚本填充H2数据库

Grails:使用run脚本填充H2数据库,grails,groovy,run-script,Grails,Groovy,Run Script,我在通过运行脚本命令填充H2 datatase时遇到一些问题: 这是我的域类: class Lab { String name static constraints = { } String toString() { return name } static mapping = { sort "name" } } 我使用grailsgenerateall命令生成了控制器和视图 我编写了一个简单的groovy脚本来添加新的实验室: import groovy.sql.Sq

我在通过运行脚本命令填充H2 datatase时遇到一些问题:

这是我的域类:

class Lab {

String name

static constraints = {
}

String toString() {
    return name
}

static mapping = {
    sort "name"
}
}

我使用grailsgenerateall命令生成了控制器和视图

我编写了一个简单的groovy脚本来添加新的实验室:

import groovy.sql.Sql

def grailsApplication
def dataSource = ctx.getBean("dataSource")
def sql = new Sql(dataSource)

Lab a = new Lab(name: "AAAAAAAAAAAAAA")
assert a.save(flush: true)

if (!a.hasErrors()) {
  println "${a.name} saved successfully!"
}
现在,当我运行它时,一切看起来都很好:

AAAAAAAAAAAAAA saved successfully!
| Script scripts/createLab.groovy complete!
但是当我刷新网页时http://localhost:8080/myapp/lab/index,我看不到创建的任何新实验室

我使用默认的H2数据库设置


我遗漏了什么吗?

您正在使用一个名为devDB h2:mem:devDB;的h2内存数据库

我在这里看到两种选择。如果你想用一个物理文件来表示你的数据库,你可以用file来代替mem

h2:file:devDb;
或者,您可以将脚本放在site Bootstrap.groovy中,每次启动应用程序时都会生成这些记录

这样:

Lab.findOrSaveWhere(name:'AAAAAAAAAA')

我不认为您需要sql。您是在同一个环境下运行这两个数据库,并且您的H2是:没有mem数据库,还是并行测试?grails中的缓存设置是什么?所以服务器是使用run app启动的,然后我想添加一些数据,所以我运行了脚本。参数为:h2:mem:devDb;MVCC=真;锁定超时=10000;DB_CLOSE_ON_EXIT=FALSE默认值。我忘了提到也安装了插件Spring security,这可能是问题吗?因为这一切看起来都很好,然后断言save,相同的env,因此我怀疑db正在缓存。您可以使用dbconsole查看正在运行的应用程序上的数据是否确实存在。如果有其他方法来创建新的实验室,它们会出现在索引页上吗?如果您现在唯一的问题是在调试数据库中获取调试数据,那么您也可以在引导数据库中进行,仅供参考。谢谢您的建议。如果我把它放在Bootsrap.groovy文件中,它就会工作,我只是不明白为什么它不能在单独的脚本中工作。我也使用dbconsole检查了数据库,但看不到创建的新实验室。我尝试了您的建议url=jdbc:h2:file:d~/.h2,但没有更改。一旦grails应用程序启动,如果我运行脚本来添加一个新的实验室,则不会向数据库中添加任何内容。请尝试将此脚本放入Bootstrap.groovy Lab.findorsaveherename:“AAAAAAAAAA”,别忘了导入您的域类谢谢,我已经成功地使其在bootsrap中工作,nut我想在一个单独的脚本中完成它,这样我就可以在服务器运行时继续添加数据。我建议您安装,然后您可以直接通过在浏览器中输入代码来完成。当然,您可以在某些类上为它创建一个帮助器方法。我认为你的脚本和应用程序不是在同一个数据库上运行的。