one-off grails script for populating database
Asked Answered
C

4

5

Update: as of Grails 1.3.6 one has access to the full domain from Gant scripts. From the Grails 1.3.6 release notes:

You can now run one or more Groovy scripts from the commandline using the run-script command, e.g.

grails run-script [path-to-script-1] [path-to-script-2]...[path-to-script-n]

This works around the issue in Gant scripts where you can't conveniently access application classes since they're not available in the classpath when the scripts start.


Hi all,

I am new to using Grails (in a real project) and I have a one-off script I need to execute that reads a file and then populates my database.

I wanted the script to run in the context of my grails app, so I used the create-script command. I now understand that makes it a 'Gant' script. The reason for doing so was that I thought it would allow me easy access to all the grails domain good-ness, so that i would be able to do something like this easily:

Car car = new Car(model: 'bar', brand: 'Ford')
car.save()

Here, Car is one of my domain classes and the strings 'bar' and 'Ford' I have retrieved from my file.

The start of my script looks like this:

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

Surprisingly, groovy gives me a java.lang.NoClassDefFoundError: com.foo.Car when I execute the script with the command grails LoadCars

Am I taking the wrong approach, or is there something more simple I am doing wrong?

Any help is appreciated

Catwalk answered 3/12, 2010 at 18:49 Comment(0)
H
2

I've updated the grails run-script Gant script (referred to by Jared above) to work with grails 1.3.5. I'd been meaning to do it for a while, but this question nudged me into finally getting around to it).

Just download the script described in the post, save it in your grails "scripts" directory and you can then run your own groovy script to bootstrap data with:

grails run-script script-path/boostrapMyDataIntoApp.groovy
Hortense answered 4/12, 2010 at 4:48 Comment(0)
P
6

i know the scripts are useful, and I will probably get hate mail for even suggesting it, but I have just incorporating this kinda of stuff directly into my application in the past.

I have a flag set in my configuration which indicates if the data should be bootstrapped, if so, the bootstrap code looks for a comma delimited file at startup and calls a service method to load up the data.

Pikeperch answered 3/12, 2010 at 19:9 Comment(0)
H
2

I've updated the grails run-script Gant script (referred to by Jared above) to work with grails 1.3.5. I'd been meaning to do it for a while, but this question nudged me into finally getting around to it).

Just download the script described in the post, save it in your grails "scripts" directory and you can then run your own groovy script to bootstrap data with:

grails run-script script-path/boostrapMyDataIntoApp.groovy
Hortense answered 4/12, 2010 at 4:48 Comment(0)
C
1

I've had to do this and you have to create a special script to allow you to access GORM from a standard grails script. See this question for more info. I'm not sure what the current status of the script is under grails 1.3 but the author of the script posted in the comments.

Circumscissile answered 3/12, 2010 at 18:57 Comment(0)
P
1

Hans, there are several choices here, assuming you are not out to polish the GANT scripting chops 8^)

So assume that you are doing some integration-mode TDD, correct? Have you looked into the db-stuff plugin? Actually that one leverages the open source package (extension of the JUnit project) called dbUnit, which is also an outstanding choice, for both Java and Groovy projects.

*db-stuff <0.3.0> -- db schema managment and data import/export. Generate generic schema files and import or export base/seed/test data into your database.


I have traditionally done this as well in the BootStrap depending on the environment - and I try to never let those domain assumptions / constraints get too far out of synch. with my schema.

Here's the canon I'm talking about :

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" )
//...
Pyosis answered 4/12, 2010 at 19:29 Comment(2)
Hi mike, I'm not doing integration tests, just trying to insert a bunch of records from a file I was given. Anyway the bootstrap hook could be useful as well and thanks for pointing out the db-stuff plugin.Catwalk
Gotcha... understand there are alternatives to the XML format dbunit uses to import / export. See dbunit.org/apidocs/org/dbunit/dataset/excel/XlsDataSet.html and dbunit.wikidot.com/demoimportexport if the files are in a format Excel can read.Pyosis

© 2022 - 2024 — McMap. All rights reserved.