скрипт одноразового грааля для заполнения базы данных - PullRequest
5 голосов
/ 03 декабря 2010

Обновление: с Grails 1.3.6 каждый имеет доступ к полному домену из скриптов Gant. Из Грааля 1.3.6 примечания к выпуску :

Теперь вы можете запускать один или несколько скриптов Groovy из командной строки с помощью команды run-script, например,

grails run-script [путь-к-сценарию-1] [путь-к-сценарию-2] ... [путь-к-сценарию-n]

Это решает проблему в сценариях Ганта, когда вы не можете получить удобный доступ к классам приложений, поскольку они не доступны в пути к классам при запуске сценариев.


Привет всем,

Я новичок в использовании Grails (в реальном проекте), и у меня есть одноразовый скрипт, который мне нужно выполнить, который читает файл и затем заполняет мою базу данных.

Я хотел, чтобы скрипт запускался в контексте моего приложения grails, поэтому я использовал команду create-script. Теперь я понимаю, что это делает сценарий «Ганта». Причиной для этого было то, что я думал, что это позволит мне легко получить доступ ко всем добротам домена 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

Удивительно, но Groovy дает мне java.lang.NoClassDefFoundError: com.foo.Car, когда я выполняю сценарий с командой grails LoadCars

Я ошибаюсь или есть что-то более простое, что я делаю неправильно?

Любая помощь приветствуется

Ответы [ 4 ]

6 голосов
/ 03 декабря 2010

я знаю, что сценарии полезны, и я, вероятно, получу письмо с ненавистью за то, что даже предложил это, но я просто включил этот вид материала прямо в свое приложение в прошлом.

В моей конфигурации установлен флаг, который указывает, следует ли загружать данные при загрузке. Если это так, код начальной загрузки при запуске ищет файл с разделителями-запятыми и вызывает служебный метод для загрузки данных.

2 голосов
/ 04 декабря 2010

Я обновил скрипт Gant Grails run-script (упоминаемый Джаредом выше) для работы с Grails 1.3.5.Я собирался сделать это какое-то время, но этот вопрос подтолкнул меня к окончательному получению ответа)затем вы можете запустить собственный скрипт Groovy для загрузки данных с помощью:

grails run-script script-path/boostrapMyDataIntoApp.groovy
1 голос
/ 04 декабря 2010

Ганс, здесь есть несколько вариантов, при условии, что вы не собираетесь полировать сценарии GANT 8 ^)

Итак, предположите, что вы используете TDD в режиме интеграции, верно? Вы смотрели в плагин db-вещи? На самом деле он использует пакет с открытым исходным кодом (расширение проекта JUnit) с именем dbUnit, что также является выдающимся выбором как для проектов Java, так и для Groovy.

* db-stuff <0.3.0> - управление схемой дБ и импорт / экспорт данных. Создайте файлы общей схемы и импортируйте или экспортируйте базовые / начальные / тестовые данные в свою базу данных.


Я традиционно делал это и в 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" )
//...
1 голос
/ 03 декабря 2010

Я должен был сделать это, и вы должны создать специальный скрипт, который позволит вам получить доступ к GORM из стандартного скрипта Grails.См. этот вопрос для получения дополнительной информации.Я не уверен, что текущий статус сценария находится под Grails 1.3, но автор сценария размещен в комментариях.

...