データベースを埋めるための1回限りのGrailsスクリプト
-
30-09-2019 - |
質問
アップデート: Grails 1.3.6の時点で、Gant Scriptsのフルドメインにアクセスできます。聖杯から 1.3.6リリースノート:
これで、runscriptコマンドを使用して、コマンドラインから1つ以上のグルーヴィーなスクリプトを実行できます。
Grails run-script [path-to-script-1] [path-to-script-2] ... [Path-to-script-n
これは、スクリプトが開始されたときにClassPathで利用できないため、アプリケーションクラスに便利にアクセスできないGantスクリプトの問題を中心に機能します。
こんにちは、みんな、
私は(実際のプロジェクトで)Grailsを使用するのが初めてであり、ファイルを読み取り、データベースを埋め込む必要がある1回限りのスクリプトがあります。
スクリプトをGrailsアプリのコンテキストで実行することを望んでいたので、Create-Scriptコマンドを使用しました。私は今、それが「ガント」スクリプトになっていることを理解しています。そうする理由は、すべてのGrailsドメインの良さに簡単にアクセスできるようになったので、このようなことを簡単に行うことができると思ったからです。
Car car = new Car(model: 'bar', brand: 'Ford')
car.save()
ここでは、車は私のドメインクラスの1つであり、ストリングス「バー」と「フォード」はファイルから取得しました。
私のスクリプトの始まりは次のようになります:
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
私は間違ったアプローチを取っていますか、それとももっと簡単なことが間違っていますか?
どんな助けも感謝しています
解決
更新しました Grails runscriptガントスクリプト (上記のJaredが参照)Grails 1.3.5で動作するため。私はしばらくそれをすることを意味していましたが、この質問は私をついにそれに近づけるように私を微妙にしました)。
投稿に記載されているスクリプトをダウンロードするだけで、Grails "Scripts"ディレクトリに保存してから、独自のGroovyスクリプトを実行して、次のことをブートストラップします。
grails run-script script-path/boostrapMyDataIntoApp.groovy
他のヒント
スクリプトが便利であることは知っています。おそらくそれを提案するために憎しみのメールを受け取るでしょうが、私はこの種のものを過去に私のアプリケーションに直接取り入れています。
構成にフラグが設定されています。これは、データをブートストラップするかどうかを示す場合です。もしそうなら、ブートストラップコードは起動時にコンマ区切りファイルを探し、データをロードするサービスメソッドを呼び出します。
私はこれをしなければなりませんでした、そしてあなたはあなたが標準的なGrailsスクリプトからGormにアクセスできるようにするために特別なスクリプトを作成する必要があります。見る この質問 詳細については。スクリプトの現在のステータスがGrails 1.3の下にあるのかわかりませんが、スクリプトの著者はコメントに投稿されています。
ハンス、ここにはいくつかの選択肢があります。あなたがガントスクリプトチョップを磨くために出かけていないと仮定して8^)
それで、あなたがいくつかの統合モードTDDをやっていると仮定しますか? DB-STUFFプラグインを調べましたか?実際、Dbunitと呼ばれるオープンソースパッケージ(Junitプロジェクトの拡張)を活用しています。これは、Javaプロジェクトとグルーヴィーなプロジェクトの両方で、顕著な選択肢でもあります。
*db-stuff <0.3.0> -DBスキーマ管理とデータのインポート/エクスポート。一般的なスキーマファイルを生成し、データベースにベース/シード/テストデータをインポートまたはエクスポートします。
私は伝統的に環境に応じてブートストラップでこれを行ってきました - そして、私はそれらのドメインの仮定 /制約が同期しすぎてしまいすぎないようにしようとしています。私のスキーマで。
これが私が話しているキヤノンです:
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" )
//...