如何在Play 2.0中为每个环境设置不同的数据库?

Bil*_*ill 22 database configuration scala playframework playframework-2.0

我希望我的Play应用程序使用不同的数据库进行测试,本地和生产(生产是Heroku)环境.

application.conf我有:

db.default.driver=org.postgresql.Driver 

%dev.db.default.url="jdbc:postgresql://localhost/foobar" 
%test.db.default.url="jdbc:postgresql://localhost/foobar-test" 
%prod.db.default.url=${DATABASE_URL} 
Run Code Online (Sandbox Code Playgroud)

这似乎不起作用.当我运行play testplay run所有数据库访问失败时:

 Configuration error [Missing configuration [db.default.url]] (Configuration.scala:258) 
Run Code Online (Sandbox Code Playgroud)

我有几个问题:

  • 在一般情况下,我有点困惑的数据库是如何在游戏配置:它看起来像有平原db,db.[DBNAME]db. [DBNAME].url与不同的教程让那些之间不同的选择.某些表达式似乎应该可以正常工作(例如db.default.url = "jdbc:...",在预期对象的位置提供字符串的错误时失败).

  • 我见过其他人认为我创建单独的prod.conf,dev.conftest.conf文件均包括application.conf然后包含特定DB-配置.但在这种情况下,如何指定test从Play控制台运行时要使用的数据库?

  • %env语法是否适用于Play 2?

  • 指定play test要使用的环境的正确方法是什么?

Jam*_*ard 21

在Play 2中,没有不同的配置环境.相反,您只需设置或覆盖conf/application.conf文件中的配置参数.一种方法是在play命令行上,如:

play -Ddb.default.driver=org.postgresql.Driver -Ddb.default.url=$DATABASE_URL ~run
Run Code Online (Sandbox Code Playgroud)

您还可以告诉Play使用其他配置文件:

play -Dconfig.file=conf/prod.conf ~run
Run Code Online (Sandbox Code Playgroud)

有关Heroku的Procfile示例,请参阅:https:
//github.com/jamesward/play2bars/blob/scala-anorm/Procfile

Play文档中的更多详细信息:http:
//www.playframework.org/documentation/2.0/Configuration

  • 这是真的,但它似乎非常容易出错:如果我指责地遗漏了配置文件名,我的(可能是破坏性的)测试套件将针对我的dev数据库运行.是不是有另一种方法可以做到这一点?来自Play 1的%prod方法似乎绰绰有余,不确定为什么它不再可用. (5认同)
  • 是的,'%prod`的东西只是Play 1.x.运行测试时,你应该可以做同样的事情:`play -Dsetting = foo~test` (2认同)

Mar*_*ser 11

至少在Play 2.1.1中,如果设置了环境变量,可能会覆盖配置值.(详情请见:http://www.playframework.com/documentation/2.1.1/ProductionConfiguration)

所以你可以在你的下面设置以下内容conf/application.conf:

db.default.url="jdbc:mysql://localhost:3306/my-db-name"
db.default.url=${?DATABASE_URL_DB}
Run Code Online (Sandbox Code Playgroud)

默认情况下,它将使用定义的JDBC-URL,除非环境变量DATABASE_URL_DB为其定义值.因此,您只需在配置中设置开发数据库,​​并为生产或阶段设置环境变量.

但请注意,如果将变量引用放在带引号的字符串中,则此替换不起作用:

db.default.url="jdbc:${?DATABASE_URL_DB}"
Run Code Online (Sandbox Code Playgroud)

相反,只是取消引用要替换的部分,例如.

database_host = "localhost"
database_host = ${?ENV_DATABASE_HOST}
db.default.url="jdbc:mysql://"${?database_host}":3306/my-db-name"
Run Code Online (Sandbox Code Playgroud)

在此示例中,如果ENV_DATABASE_HOST未设置环境变量,则默认情况下将使用localhost .(有关详细信息,请参阅:https://www.playframework.com/documentation/2.5.x/ConfigFile#substitutions)