Скрипт одноразового грааля для заполнения базы данных

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

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

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

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


Всем привет,

Я новичок в использовании 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

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

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

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

4 ответа

Решение

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

Просто скачайте скрипт, описанный в посте, сохраните его в своем каталоге grails "scripts", и затем вы сможете запустить свой собственный скрипт groovy для загрузки данных с помощью:

grails run-script script-path/boostrapMyDataIntoApp.groovy

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

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

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

Ганс, здесь есть несколько вариантов, при условии, что ты не собираешься полировать сценарии 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" )
//...
Другие вопросы по тегам