Heroku - 通过Play Framework应用程序无法设置Postgres数据库?

5
我将尝试在Heroku上通过Play框架应用程序设置Postgres数据库,但是我一直收到有关我的DATABASE_URL的错误。
堆栈跟踪:-
-----> Heroku receiving push
-----> Play 2.0 - Java app detected
-----> Running: sbt clean compile stage
       Getting net.java.dev.jna jna 3.2.3 ...
       :: retrieving :: org.scala-sbt#boot-jna
        confs: [default]
        1 artifacts copied, 0 already retrieved (838kB/25ms)
       Getting org.scala-tools.sbt sbt_2.9.1 0.11.2 ...
       :: retrieving :: org.scala-sbt#boot-app
        confs: [default]
        37 artifacts copied, 0 already retrieved (7324kB/78ms)
       Getting Scala 2.9.1 (for sbt)...
       :: retrieving :: org.scala-sbt#boot-scala
        confs: [default]
        4 artifacts copied, 0 already retrieved (19939kB/188ms)
       [info] Loading global plugins from /tmp/build_hdhsg4dgyxy/.sbt_home/.sbt/plugins
       [info] Updating {file:/tmp/build_hdhsg4dgyxy/.sbt_home/.sbt/plugins/}default-05c586...
       [info] Resolving org.scala-tools.sbt#sbt_2.9.1;0.11.2 ...
       [info] Resolving org.scala-tools.sbt#main_2.9.1;0.11.2 ...
       [info] Resolving org.scala-tools.sbt#actions_2.9.1;0.11.2 ...
       [info] Resolving org.scala-tools.sbt#classfile_2.9.1;0.11.2 ...
       [info] Resolving org.scala-tools.sbt#io_2.9.1;0.11.2 ...
       [info] Resolving org.scala-tools.sbt#control_2.9.1;0.11.2 ...
       [info] Resolving org.scala-lang#scala-library;2.9.1 ...
       [info] Resolving org.scala-tools.sbt#interface;0.11.2 ...
       [info] Resolving org.scala-tools.sbt#logging_2.9.1;0.11.2 ...
       [info] Resolving org.scala-tools.sbt#process_2.9.1;0.11.2 ...
       [info] Resolving org.scala-tools.sbt#classpath_2.9.1;0.11.2 ...
       [info] Resolving org.scala-tools.sbt#launcher-interface_2.9.1;0.11.2 ...
       [info] Resolving org.scala-lang#scala-compiler;2.9.1 ...
       [info] Resolving org.scala-tools.sbt#incremental-compiler_2.9.1;0.11.2 ...
       [info] Resolving org.scala-tools.sbt#collections_2.9.1;0.11.2 ...
       [info] Resolving org.scala-tools.sbt#api_2.9.1;0.11.2 ...
       [info] Resolving org.scala-tools.sbt#persist_2.9.1;0.11.2 ...
       [info] Resolving org.scala-tools.sbinary#sbinary_2.9.0;0.4.0 ...
       [info] Resolving org.scala-tools.sbt#compile_2.9.1;0.11.2 ...
       [info] Resolving org.scala-tools.sbt#ivy_2.9.1;0.11.2 ...
       [info] Resolving org.apache.ivy#ivy;2.2.0 ...
       [info] Resolving com.jcraft#jsch;0.1.31 ...
       [info] Resolving commons-httpclient#commons-httpclient;3.1 ...
       [info] Resolving commons-logging#commons-logging;1.0.4 ...
       [info] Resolving commons-codec#commons-codec;1.2 ...
       [info] Resolving org.scala-tools.sbt#completion_2.9.1;0.11.2 ...
       [info] Resolving jline#jline;0.9.94 ...
       [info] Resolving org.scala-tools.sbt#run_2.9.1;0.11.2 ...
       [info] Resolving org.scala-tools.sbt#task-system_2.9.1;0.11.2 ...
       [info] Resolving org.scala-tools.sbt#tasks_2.9.1;0.11.2 ...
       [info] Resolving org.scala-tools.sbt#tracking_2.9.1;0.11.2 ...
       [info] Resolving org.scala-tools.sbt#cache_2.9.1;0.11.2 ...
       [info] Resolving org.scala-tools.sbt#testing_2.9.1;0.11.2 ...
       [info] Resolving org.scala-tools.testing#test-interface;0.5 ...
       [info] Resolving org.scala-tools.sbt#compiler-interface;0.11.2 ...
       [info] Resolving org.scala-tools.sbt#precompiled-2_8_1;0.11.2 ...
       [info] Resolving org.scala-tools.sbt#precompiled-2_8_0;0.11.2 ...
       [info] Resolving org.scala-tools.sbt#precompiled-2_9_0;0.11.2 ...
       [info] Done updating.
       [info] Compiling 1 Scala source to /tmp/build_hdhsg4dgyxy/.sbt_home/.sbt/plugins/target/scala-2.9.1/sbt-0.11.2/classes...
       [info] Loading project definition from /tmp/build_hdhsg4dgyxy/project
       [info] Set current project to PostDemo (in build file:/tmp/build_hdhsg4dgyxy/)
       [success] Total time: 0 s, completed Jun 28, 2012 2:20:47 AM
       [info] Updating {file:/tmp/build_hdhsg4dgyxy/}PostDemo...
[info] downloading http://repo.typesafe.com/typesafe/releases/postgresql/postgresql/9.1-901.jdbc4/postgresql-9.1-901.jdbc4.jar ...
       [info]   [SUCCESSFUL ] postgresql#postgresql;9.1-901.jdbc4!postgresql.jar (117ms)
       [info] Done updating.
       [info] Compiling 4 Scala sources and 4 Java sources to /tmp/build_hdhsg4dgyxy/target/scala-2.9.1/classes...
       [error] {file:/tmp/build_hdhsg4dgyxy/}PostDemo/compile:compile: com.typesafe.config.ConfigException$UnresolvedSubstitution: conf/application.conf: 37: Could not resolve substitution to a value: ${DATABASE_URL}
       [error] Total time: 10 s, completed Jun 28, 2012 2:20:57 AM
 !     Failed to build app with sbt
 !     Heroku push rejected, failed to compile Play 2.0 - java app
       error: failed to push some refs to 'git@heroku.com.git'

我使用以下命令将DATABASE_URL设置为环境变量:-
echo "export DATABASE_URL=postgres://postgres:1234@localhost/Play">>.bash_profile
 . .bash_profile

我尝试设置另一个URL,使用命令heroku config找到了一个很长的postgres URL,但也没有起作用,每次都出现相同的异常。

这是我在application.conf文件中添加的内容:

%prod.db=${DATABASE_URL}

依赖关系

val appDependencies = Seq(
   "postgresql" % "postgresql" % "9.1-901.jdbc4"
)

现在我对我的DATABASE_URL感到困惑。为什么Heroku无法用合适的值替换它。Heroku在哪里寻找合适的URL?是在我的application.conf文件中还是在我系统的bash配置文件中设置的环境变量中?

非常感谢任何帮助。

谢谢

编辑

日志

2012-06-28 20:38:18,500 - [INFO] - from play in main 
Listening for HTTP on port 9000...

2012-06-28 20:38:25,862 - [INFO] - from play in play-akka.actor.default-dispatcher-1 
database [default] connected at jdbc:postgresql://localhost/Play

2012-06-28 20:38:27,470 - [ERROR] - from application in New I/O server worker #1-1 


! @6aoffk4jk - Internal server error, for request [GET /login/?username=abc&&password=abc] ->

play.api.db.evolutions.InvalidDatabaseRevision: Database 'default' needs evolution! [An SQL script need to be run on your database.]
    at play.api.db.evolutions.EvolutionsPlugin$$anonfun$onStart$1.apply(Evolutions.scala:424) ~[play_2.9.1.jar:2.0.1]
    at play.api.db.evolutions.EvolutionsPlugin$$anonfun$onStart$1.apply(Evolutions.scala:410) ~[play_2.9.1.jar:2.0.1]
    at scala.collection.LinearSeqOptimized$class.foreach(LinearSeqOptimized.scala:59) ~[scala-library.jar:0.11.2]
    at scala.collection.immutable.List.foreach(List.scala:45) ~[scala-library.jar:0.11.2]
    at play.api.db.evolutions.EvolutionsPlugin.onStart(Evolutions.scala:410) ~[play_2.9.1.jar:2.0.1]
    at play.api.Play$$anonfun$start$1.apply(Play.scala:60) ~[play_2.9.1.jar:2.0.1]
    at play.api.Play$$anonfun$start$1.apply(Play.scala:60) ~[play_2.9.1.jar:2.0.1]
    at scala.collection.LinearSeqOptimized$class.foreach(LinearSeqOptimized.scala:59) ~[scala-library.jar:0.11.2]
    at scala.collection.immutable.List.foreach(List.scala:45) ~[scala-library.jar:0.11.2]
    at play.api.Play$.start(Play.scala:60) ~[play_2.9.1.jar:2.0.1]
    at play.core.ReloadableApplication$$anonfun$get$1$$anonfun$apply$3$$anonfun$1.apply(ApplicationProvider.scala:125) ~[play_2.9.1.jar:2.0.1]
    at play.core.ReloadableApplication$$anonfun$get$1$$anonfun$apply$3$$anonfun$1.apply(ApplicationProvider.scala:112) ~[play_2.9.1.jar:2.0.1]
    at scala.Option.map(Option.scala:133) ~[scala-library.jar:0.11.2]
    at play.core.ReloadableApplication$$anonfun$get$1$$anonfun$apply$3.apply(ApplicationProvider.scala:112) ~[play_2.9.1.jar:2.0.1]
    at play.core.ReloadableApplication$$anonfun$get$1$$anonfun$apply$3.apply(ApplicationProvider.scala:110) ~[play_2.9.1.jar:2.0.1]
    at scala.Either$RightProjection.flatMap(Either.scala:277) ~[scala-library.jar:0.11.2]
    at play.core.ReloadableApplication$$anonfun$get$1.apply(ApplicationProvider.scala:110) ~[play_2.9.1.jar:2.0.1]
    at play.core.ReloadableApplication$$anonfun$get$1.apply(ApplicationProvider.scala:110) ~[play_2.9.1.jar:2.0.1]
    at akka.dispatch.Future$$anon$3.liftedTree1$1(Future.scala:195) ~[akka-actor.jar:2.0.1]
    at akka.dispatch.Future$$anon$3.run(Future.scala:194) ~[akka-actor.jar:2.0.1]
    at akka.dispatch.TaskInvocation.run(AbstractDispatcher.scala:83) ~[akka-actor.jar:2.0.1]
    at akka.jsr166y.ForkJoinTask$AdaptedRunnableAction.exec(ForkJoinTask.java:1381) ~[akka-actor.jar:2.0.1]
    at akka.jsr166y.ForkJoinTask.doExec(ForkJoinTask.java:259) ~[akka-actor.jar:2.0.1]
    at akka.jsr166y.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:974) ~[akka-actor.jar:2.0.1]
    at akka.jsr166y.ForkJoinPool.runWorker(ForkJoinPool.java:1478) ~[akka-actor.jar:2.0.1]
    at akka.jsr166y.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:104) ~[akka-actor.jar:2.0.1]

2012-06-28 20:38:30,150 - [WARN] - from play in New I/O server worker #1-1 
Applying evolution script for database 'default':

# !!! WARNING! This script contains DOWNS evolutions that are likely destructives

# --- Rev:2,Downs - eddafc8
delete from admins;
delete from employees;

# --- Rev:2,Ups - 822c4da
insert into admins (username, password) values ('abc', 'abc');
insert into admins (username, password) values ('abc', 'abc');

insert into employees (id,name,email) values (1, 'Super Man', 'superman@superhero.com');
insert into employees (id,name,email) values (2, 'Bat man', 'batman@superhero.com');
insert into employees (id,name,email) values (3, 'Spider Man', 'spidy@superhero.com');
insert into employees (id,name,email) values (4, 'Iron Man', 'ironman@superhero.com');


2012-06-28 20:38:30,741 - [INFO] - from play in play-akka.actor.default-dispatcher-1 
database [default] connected at jdbc:postgresql://localhost/Play

2012-06-28 20:38:31,519 - [INFO] - from play in play-akka.actor.default-dispatcher-1 
Application started (Dev)

1
当你运行 heroku config 命令时,你是否看到了 DATABASE_URL 的值? - Ryan Daigle
@RyanDaigle 是的,我看到了。我也尝试使用那个URL,但没有成功。 - Varundroid
2个回答

18

看起来您混淆了某些Play 1和Play 2的约定。 看起来您正在使用Play 2。 在Play 2中,设置最简单的方法是不在application.conf中使用DATABASE_URL,而是在Procfile中覆盖数据库配置:

web: target/start -Dhttp.port=$PORT -DapplyEvolutions.default=true -Ddb.default.driver=org.postgresql.Driver -Ddb.default.url=$DATABASE_URL

如需更详细的教程,请参阅我的Play 2 教程


谢谢,我已经弄明白了。非常感谢您提供如此好的教程,它将对我很有帮助。 - Varundroid
我已经更新了我的问题并附上了日志内容。它给出了一些关于演化的警告。这是我第一次部署时的日志,但在第二次部署时,它不再包含超过3行的内容。 - Varundroid
请确保在您的Procfile中有-DapplyEvolutions.default=true,以自动应用数据库演化。 - James Ward
1
为了让我工作,它必须是 web: target/universal/stage/bin/myApp ... 而不是 web: target/start ... - Matthias Braun
感谢@MatthiasBraun。是的,这是Play 2.3(左右)迁移到sbt-native-packager的一部分。 - James Ward
显示剩余2条评论

1
使用play 2.4,Slick 3.0.3和Heroku中的postgres,我已经成功地运行了下面的设置来运行我的SQL演化脚本:
在build.sbt中:
name := """app-name"""

并在libraryDependencies中添加以下内容:++= Seq(

"com.typesafe.play" %% "play-slick" % "1.0.1",
"com.typesafe.play" %% "play-slick-evolutions" % "1.0.1",
"com.typesafe.slick" %% "slick" % "3.0.3",
"org.postgresql" % "postgresql" % "9.4-1201-jdbc41",
"org.slf4j" % "slf4j-nop" % "1.6.4",

in application.conf:

slick.dbs.default.driver ="slick.driver.PostgresDriver$"
slick.dbs.default.db.dataSourceClass = "slick.jdbc.DatabaseUrlDataSource"
slick.dbs.default.db.properties.driver = "org.postgresql.Driver"

并且在Procfile中:

web: target/universal/stage/bin/app-name -Dhttp.port=${PORT} -Dplay.evolutions.db.default.autoApply=true

干杯!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接