一次性的Grail脚本用于填充数据库
-
30-09-2019 - |
题
更新: 从Grails 1.3.6开始,人们可以从Gant脚本访问完整域。来自圣杯 1.3.6发行说明:
现在,您可以使用Run-Script命令从命令行中运行一个或多个Groovy脚本,例如
Grails Run-scrip [path to-script-1] [途径到script-2] ... [途径script-n
这在gant脚本中围绕该问题可行,在该问题中,您无法方便地访问应用程序类,因为脚本启动时在类路径中不可用。
大家好,
我是使用Grails的新手(在一个真实的项目中),并且我需要执行一个读取文件然后填充数据库的一次性脚本。
我希望脚本在Grails应用程序的上下文中运行,因此我使用了Create-Script命令。我现在明白这使它成为一个“ gant”脚本。这样做的原因是,我认为它可以轻松访问所有Grails域好处,以便我能够轻松地做类似的事情:
Car car = new Car(model: 'bar', brand: 'Ford')
car.save()
在这里,汽车是我的域类,我从文件中检索到了“ bar”和“福特”。
我的脚本的开始看起来像这样:
import com.foo.Car
grailsHome = Ant.project.properties."environment.GRAILS_HOME"
includeTargets << new File ( "${grailsHome}/scripts/Bootstrap.groovy" )
target(main: "a script for storing cars") {
depends(bootstrap, classpath) // code dealing with the file with cars follows
令人惊讶的是,Groovy给了我一个 java.lang.NoClassDefFoundError: com.foo.Car
当我用命令执行脚本时 grails LoadCars
我是在做错方法,还是我做错了什么简单的事情?
任何帮助都将受到赞赏
解决方案
我已经更新了 Grails Run-Script Gant脚本 (上面的Jared提到)与Grails 1.3.5合作。我一直想这样做一段时间,但是这个问题使我终于解决了这个问题。
只需下载帖子中描述的脚本,将其保存在您的Grails“脚本”目录中,然后您可以运行自己的groovy脚本以使用:
grails run-script script-path/boostrapMyDataIntoApp.groovy
其他提示
我知道这些脚本很有用,甚至可能会提出仇恨邮件,但我只是将这种内容直接纳入我的应用程序。
我的配置中有一个标志集,该标志指示是否应引导数据,如果是的,则引导程序代码在启动时寻找一个逗号界限文件,并调用一个服务方法来加载数据。
我必须这样做,您必须创建一个特殊的脚本,以允许您从标准的Grails脚本访问Gorm。看 这个问题 有关更多信息。我不确定脚本的当前状态在Grails 1.3下是什么,但在评论中发布的脚本的作者。
汉斯,这里有几种选择,假设您不愿意抛光脚印脚本8^)
因此,假设您正在做一些集成模式TDD,对吗?您是否查看了DB-STUFF插件?实际上,对于Java和Groovy项目而言,一个名为Dbunit的开源包(JUNIT项目的扩展)也是一个出色的选择。
*db-stuff <0.3.0> - DB模式管理和数据导入/导出。生成通用架构文件,并将基本/种子/测试数据导入或导出到数据库中。
传统上,我在引导程序中也这样做了,具体取决于环境 - 我试图永远不要让这些域名的假设 /约束变得太远了。使用我的模式。
这是我在说的佳能:
class BootStrap {
def init = { servletContext ->
if (GrailsUtil.environment.equals( GrailsApplication.ENV_DEVELOPMENT )) {
log.info( "Loading sample data for 2010 models..." );
new Car( manufacturer: new Manufacturer( name: "Toyota" ), model: "Prius" )
new Car( manufacturer: new Manufacturer( name: "GM" ), model: "Volt" )
//...