Воспроизведение приложения на Heroku с использованием общих баз данных и обновлений моделей - PullRequest
3 голосов
/ 14 ноября 2011

Я играю с приложением Play 1.2.3 (Java), использующим экземпляр Heroku с общей базой данных.

Мой вопрос: как обновить схему базы данных после развертывания приложения?На самом деле, как даже инициализировать базу данных, так как она изначально пуста и Hibernate ddl в режиме PROD отключен?

На опциях, которые я пробовал:

  1. Hibernate ddl autoэто большой запрет на производство
  2. Play Evolutions - беспорядок, если вы используете Hibernate, они создают слишком много проблем во время разработки, чтобы использовать их или полагаться на них
  3. Общие базы данных Heroku (опция free или опция 20gb) не предоставляют доступ к консоли Psql, поэтому вы не можете сделать это вручную с помощью сценариев (как мне хотелось бы)

Это проблема, связанная с разницей в стоимости междубесплатный дБ (15 $ / месяц) и самый дешевый вариант, который дает доступ к Psql (200 $ / месяц), огромен, и для загруженного сайта «тестирования на воде» это имеет значение.

Любой из васвозникла эта проблема?Как вы решаете это?

Ответы [ 2 ]

3 голосов
/ 23 ноября 2011

Я использую это: https://github.com/ddollar/heroku-sql-console. Это просто дает вам консоль SQL в вашей настройке - я не пытался выполнять сценарии.

2 голосов
/ 14 ноября 2011

Одной альтернативой общей базе данных Heroku является использование другой базы данных где-нибудь на AWS (ваш собственный сервер EC2 или база данных RDS).

Однако, если вы хотите придерживаться общей базы данных, вам понадобится какой-нибудь способ выполнить скрипт db на Heorku. Есть несколько разных способов сделать это. Play Evolutions - один из вариантов, но поскольку вы не хотите их использовать, вы можете использовать что-то вроде iBatis ScriptRunner. Создайте простое Java-приложение, которое может запускать сценарий sql. Вот действительно простой пример:

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);

Просто поместите что-то вроде этого класса где-нибудь в директорию вашего приложения, а затем запустите что-то вроде:

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