Скрипт одноразового грааля для заполнения базы данных
Обновление: начиная с 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" )
//...