使用共享数据库和模型更新在Heroku上播放应用程序

时间:2011-11-13 22:16:59

标签: java hibernate heroku playframework database-update

我正在使用带有共享数据库的Heroku实例使用Play 1.2.3应用程序(Java)。

我的问题是:部署应用程序后如何更新数据库架构?实际上,如何初始化数据库,因为它最初为空并且PROD模式下的Hibernate ddl被禁用了?

关于我尝试过的选项:

  1. Hibernate ddl auto是一个很大的禁忌生产
  2. Play Evolutions如果使用Hibernate会很麻烦,他们在开发过程中给我带来太多问题,无法使用它们或依赖它们
  3. Heroku共享数据库(免费选项或20gb选项)不提供Psql控制台访问权限,因此您无法通过脚本手动执行(如我所愿)
  4. 这是一个问题,因为免费数据库(15美元/月)与提供Psql访问权限最便宜的选项(200美元/月)之间的成本差异很大,并且对于自助式“测试水域”网站而言这很重要。

    你们有这个问题吗?你是怎么解决的?

2 个答案:

答案 0 :(得分:3)

我使用这个:https://github.com/ddollar/heroku-sql-console。 它只是在您的设置中为您提供了一个SQL控制台 - 我没有尝试执行脚本。

答案 1 :(得分:2)

Heroku共享数据库的一个替代方案是在AWS上使用另一个数据库(您自己的EC2服务器或RDS数据库)。

但是,如果您想坚持使用共享数据库,那么您需要一些方法在Heorku上执行db脚本。有几种不同的方法可以做到这一点。 Play Evolutions是一个选项,但由于您不想使用它们,您可以使用类似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);

只需在app dir的某处放置类似于某个类的内容,然后运行类似:

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