用于填充数据库的一次性grails脚本

更新:从Grails 1.3.6开始,可以从Gant脚本访问完整域。 从Grails 1.3.6发行说明: 您现在可以使用run-script命令从命令行运行一个或多个Groovy脚本,例如 grails run-script [path-to-script-1] [path-to-script-2] ... [path-to-script-n] 这解决了Gant脚本中无法方便地访问应用程序类的问题,因为脚本启动时它们在类路径中不可用。 大家好, 我是新手使用Grails(在一个真实的项目中),我有一个我需要执行的一次性脚本,它读取一个文件,然后填充我的数据库。 我希望脚本在我的grails应用程序的上下文中运行,所以我使用了create-script命令。我现在明白这使它成为一个'Gant'脚本。这样做的原因是我认为它可以让我轻松访问所有grails域的优点,这样我就可以轻松地做到这样的事情:
Car car = new Car(model: 'bar', brand: 'Ford')
car.save()
在这里,Car是我的一个域类,我从文件中检索到了字符串'bar'和'Ford'。 我的脚本的开头看起来像这样:
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
令人惊讶的是,当我使用命令
grails LoadCars
执行脚本时,groovy给了我一个
java.lang.NoClassDefFoundError: com.foo.Car
我采取了错误的方法,还是有一些更简单的我做错了? 任何帮助表示赞赏     
已邀请:
我已经更新了grails run-script Gant脚本(上面提到的Jared)来处理grails 1.3.5。我一直想做这件事,但这个问题让我最终开始讨论它。 只需下载帖子中描述的脚本,将其保存在grails“scripts”目录中,然后您可以运行自己的groovy脚本来引导数据:
grails run-script script-path/boostrapMyDataIntoApp.groovy
    
我知道这些脚本是有用的,我甚至可能会收到讨厌的邮件甚至建议它,但我过去只是将这类东西直接加入到我的应用程序中。 我在配置中设置了一个标志,指示数据是否应该被引导,如果是这样,引导代码在启动时查找逗号分隔文件并调用服务方法来加载数据。     
我必须这样做,你必须创建一个特殊的脚本,允许你从标准的grails脚本访问GORM。有关详细信息,请参阅此问题。我不确定脚本的当前状态是在grails 1.3下,但是脚本的作者在评论中发布了。     
汉斯,这里有几个选择,假设你没有出去打磨GANT脚本印章8 ^) 所以假设你正在做一些集成模式的TDD,对吗? 你有没有看过db-stuff插件?实际上,人们利用名为dbUnit的开源软件包(JUnit项目的扩展),这对Java和Groovy项目来说也是一个很好的选择。 * db-stuff&lt; 0.3.0> - db模式管理和数据导入/导出。生成通用模式文件,并将基础/种子/测试数据导入或导出到数据库中。 我传统上也在BootStrap中根据环境做到这一点 - 我试图永远不要让这些域假设/约束太过不同步。用我的架构。 这是我正在谈论的经典:
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" )
//...
    

要回复问题请先登录注册