2011-11-13 11 views
3

私は共有データベースを使用してHerokuインスタンスを使用してPlay 1.2.3アプリケーション(Java)を扱っています。共有データベースとモデルの更新を使用してHerokuでアプリケーションを再生

私の質問は、アプリケーションのデプロイ後にデータベーススキーマを更新する方法です。実際には、データベースを初期化する方法もあります。最初は空でPRODモードのHibernate ddlは無効になっていますか?私が試したオプションに

  1. にHibernateのDDL自動が大きいノーノー生産に
  2. プレイエボリューションを使用すると、休止状態を使用している場合、彼らは私に中にあまりにも多くの問題を与えている混乱しています
  3. Heroku共有データベース(無料オプションまたは20GBオプション)は、Psqlコンソールアクセスを提供しないので、スクリプトで手動で実行することはできません(私が望むように)

これは、無料のdb(15 $ /月)とPsqlアクセス(200 $ /月)を提供する最も安いオプションとのコスト差が大きく、ブートストラップされた "テスト水域"サイトにとって重要な問題です。

この問題が発生したことはありますか?どのようにそれを解決していますか?

+0

PRODのDEVおよびevolutionsでddlアップデートを使用できませんか? –

+0

@マリアス "問題"は、私がevolutionsスクリプトを作成すると、PlayもDEVでそれらを実行するということです。また、問題を回避するため、開発者の変更を最初にテストできるようにしたい。 –

+0

さて、あなたのコードが実稼働の準備が整うまで、再生専用のソリューションはHibernate DDLを使うことになると思います。そして、あなたはあなたの進化をテストするためにFixturesで新しいデータベースを作成する(または以前のスナップショットを復元する)でしょう。 –

答えて

2

Heroku共有データベースの1つの代替方法は、別のデータベースをAWS(自分のEC2サーバーまたはRDSデータベース)のどこかで使用することです。

ただし、共有データベースを使用したい場合は、Heorkuでdbスクリプトを実行する方法が必要です。これを行うにはいくつかの方法があります。 Play Evolutionsは1つのオプションですが、それらを使用したくないので、iBatis ScriptRunnerのようなものを使用できます。 SQLスクリプトを実行できるシンプルなJavaアプリケーションを作成します。ここでは本当に簡単な例です:

String dbUri = System.getenv("DATABASE_URL"); 
Class.forName("org.postgresql.Driver"); 
String username = dbUri.getUserInfo().split(":")[0]; 
String password = dbUri.getUserInfo().split(":")[1]; 
String dbUrl = "jdbc:postgresql://" + dbUri.getHost() + dbUri.getPath() + "?user=" + username + "&password=" + password; 
Connection connection = DriverManager.getConnection(dbUrl); 

InputStreamReader inputStreamReader = new InputStreamReader(ClassLoader.getSystemResourceAsStream(sqlFile)); 

Reader reader = new BufferedReader(inputStreamReader); 

ScriptRunner scriptRunner = new ScriptRunner(connection, false, true); 
scriptRunner.runScript(reader); 

ただ、どこかのアプリのディレクトリで、そのクラスのようなものを置くと、その後のようなもので、それを実行します。https://github.com/ddollar/heroku-sql-console:私はこの1つを使用し

heroku run "java -cp lib/postgres.jar:tmp/classes foo.SchemaCreator" 
+0

Evolutionsの主な問題は、私がそれらを使いたくないということではなく、dev mdoeのスクリプトをHibernateのddlアップデートと競合することなく使用できないことです。 devモードでHibernate ddlを無効にすると余分な作業ができます。あなたの提案は面白そうだ:) –

3

。 セットアップでSQLコンソールを提供するだけで、スクリプトを実行しようとはしませんでした。

+0

素晴らしい、ありがとう百万! –

+0

ddollar ;-)に感謝を送る –

関連する問題