【问题标题】:Errors in evolutions on HerokuHeroku 的进化错误
【发布时间】:2012-08-25 02:30:05
【问题描述】:

我尝试将一些演变推向 Heroku:

2012-08-30T10:58:00+00:00 heroku[slugc]: Slug compilation finished
2012-08-30T10:58:02+00:00 heroku[web.1]: Starting process with command `target/start -Dhttp.port=32436 -Xmx384m -Xss512k
 -XX:+UseCompressedOops`
2012-08-30T10:58:03+00:00 app[web.1]: Play server process ID is 2
2012-08-30T10:58:05+00:00 app[web.1]: [←[37minfo←[0m] play - database [default] connected at [Database-address]
2012-08-30T10:58:05+00:00 app[web.1]: CREATE TABLE `unapprovedteaminfo` (
---
Copy of 1.sql
---
2012-08-30T10:58:05+00:00 app[web.1]: VALUES (1, 2, 2, '2012-01-01 00:00:00', 'k');
2012-08-30T10:58:05+00:00 app[web.1]: ERROR: syntax error at or near "`"
2012-08-30T10:58:05+00:00 app[web.1]:   Position: 14 [ERROR:0, SQLSTATE:42601]
2012-08-30T10:58:05+00:00 app[web.1]: Oops, cannot start the server.
2012-08-30T10:58:05+00:00 app[web.1]: PlayException: Database 'default' is in inconsistent state! [An evolution has not
been applied properly. Please check the problem and resolve it manually before marking it as resolved.]
2012-08-30T10:58:05+00:00 app[web.1]:   at play.api.db.evolutions.Evolutions$.checkEvolutionsState(Evolutions.scala:155)

2012-08-30T10:58:05+00:00 app[web.1]:   at play.api.db.evolutions.Evolutions$.databaseEvolutions(Evolutions.scala:308)
2012-08-30T10:58:05+00:00 app[web.1]:   at play.api.db.evolutions.Evolutions$.evolutionScript(Evolutions.scala:284)
2012-08-30T10:58:05+00:00 app[web.1]:   at play.api.db.evolutions.EvolutionsPlugin$$anonfun$onStart$1.apply(Evolutions.s
cala:412)
2012-08-30T10:58:05+00:00 app[web.1]:   at play.api.db.evolutions.EvolutionsPlugin$$anonfun$onStart$1.apply(Evolutions.s
cala:410)
2012-08-30T10:58:05+00:00 app[web.1]:   at scala.collection.LinearSeqOptimized$class.foreach(LinearSeqOptimized.scala:59
)
2012-08-30T10:58:05+00:00 app[web.1]:   at scala.collection.immutable.List.foreach(List.scala:45)
2012-08-30T10:58:05+00:00 app[web.1]:   at play.api.db.evolutions.EvolutionsPlugin.onStart(Evolutions.scala:410)
2012-08-30T10:58:05+00:00 app[web.1]:   at play.api.Play$$anonfun$start$1.apply(Play.scala:60)
2012-08-30T10:58:05+00:00 app[web.1]:   at play.api.Play$$anonfun$start$1.apply(Play.scala:60)
2012-08-30T10:58:05+00:00 app[web.1]:   at scala.collection.LinearSeqOptimized$class.foreach(LinearSeqOptimized.scala:59
)
2012-08-30T10:58:05+00:00 app[web.1]:   at scala.collection.immutable.List.foreach(List.scala:45)
2012-08-30T10:58:05+00:00 app[web.1]:   at play.api.Play$.start(Play.scala:60)
2012-08-30T10:58:05+00:00 app[web.1]:   at play.core.StaticApplication.<init>(ApplicationProvider.scala:51)
2012-08-30T10:58:05+00:00 app[web.1]:   at play.core.server.NettyServer$.createServer(NettyServer.scala:132)
2012-08-30T10:58:05+00:00 app[web.1]:   at play.core.server.NettyServer$$anonfun$main$5.apply(NettyServer.scala:153)
2012-08-30T10:58:05+00:00 app[web.1]:   at play.core.server.NettyServer$$anonfun$main$5.apply(NettyServer.scala:152)
2012-08-30T10:58:05+00:00 app[web.1]:   at scala.Option.map(Option.scala:133)
2012-08-30T10:58:05+00:00 app[web.1]:   at play.core.server.NettyServer$.main(NettyServer.scala:152)
2012-08-30T10:58:05+00:00 app[web.1]:   at play.core.server.NettyServer.main(NettyServer.scala)
2012-08-30T10:58:06+00:00 heroku[web.1]: Process exited with status 255
2012-08-30T10:58:06+00:00 heroku[web.1]: State changed from starting to crashed

这些演变与 H2 配合得很好,我想 POSTGRESQL 语法一定有一些问题。无论如何,我现在遇到的问题是,即使我更改 1.sql 并在 Heroku 上推送新版本,日志中也会出现相同的错误 - 复制的 1.sql 不会根据新推送的版本而更改.

【问题讨论】:

  • 那些日志看起来有点乱。 VALUES (1, 2, 2, '2012-01-01 00:00:00', 'k'); 本身是一个完全合法的 SQL 语句,PostgreSQL 可以接受它(在 psql 中尝试)。但是,我怀疑是 INSERT 声明的后半部分被砍掉了。看看你能不能得到你的工具来不砍伐日志。
  • @CraigRinger 我自己编辑了进化,我不能真正与互联网分享它的内容。

标签: postgresql heroku playframework playframework-2.0


【解决方案1】:

如果您要发送到 Heroku 1.sqlH2 生成的文件,它们很可能会发生冲突,相反,将 application.conf 中的 Heroku url 设置为 db.default.url 并在开发模式下运行它localhost 首先生成有效的 Postres SQL。此外,您还需要注释掉 db.default.userdb.default.password 设置,因为 Heroku 的 URL 已经包含此信息。

如果您不知道当前连接的 URL,您可以在以下位置找到它:

https://postgres.heroku.com/ -> YourDBs -> db-name -> Connection settings -> JDBC URL

要从本地主机(或其他机器,不在 Heroku 的空间)连接,您需要将此参数添加到 URL:

&ssl=true&sslfactory=org.postgresql.ssl.NonValidatingFactory

多亏了这种方法,您可以在本地测试您的应用程序,并建立与远程 Heroku 数据库的连接,(不要感到惊讶 - 这种组合将比使用 local app + local DBHeroku app + Heroku DB 慢得多)无论如何测试它比反复将小修复推送到云端要好。

您还可以从 localhost 执行进化 - 无需将代码推送到 Heroku,如果您的 SQL 有问题,这确实是一种更短的方法。

此外,这是在本地开发模式下打开 SQL 日志记录并寻找冗余 SQL 查询的好时机,如果您将删除所有不必要的查询并在 localhost 上得到满足,那么在部署到 Heroku 后,您将非常更满意:)

重置

如果您将创建正确的1.sql 文件,那么您很可能需要重置包含无效结构的数据库(因为我认为这还不是问题,因为您只是从本地移动到 Heroku)。首先找到当前应用程序的数据库名称(使用 bash,在应用程序的文件夹中):

heroku pg

然后重置它(它会破坏所有数据,因此如果您不想丢失数据,请先考虑备份!):

heroku pg:reset HEROKU_DATABASE_SOMEBASE

【讨论】:

  • 如何在本地测试进化?
【解决方案2】:

我认为您对 VALUES 中数据时间字段的定义存在一些问题。我发布了我的 play 2.4、Slick 3.0.3 和 postgres 的工作演变配置设置。我自动生成了放在进化文件夹中的 *.sql 文件。

Regenerate evolution scripts in play 2

干杯

【讨论】:

    猜你喜欢
    • 2012-05-03
    • 2014-10-21
    • 2013-03-18
    • 2011-10-06
    • 2016-01-19
    • 1970-01-01
    • 1970-01-01
    • 2013-06-30
    • 1970-01-01
    相关资源
    最近更新 更多