Heroku上的Rails应用程序无法写入PostgreSQL数据库,只能读取
我有一个Ruby on Rails应用程序,它可以在本地使用sqlite3数据库正常工作,并且可以保存并检索记录。
当使用postgresql数据库在http://moviedata.herokuapp.com/部署到Heroku时,即使看起来像日志说明的那样记录也不会保存。 从db中读取的记录正常并且数据按预期显示。
添加记录的尾日志是:
2012-08-21T19:51:31+00:00 app[web.1]:
2012-08-21T19:51:31+00:00 app[web.1]:
2012-08-21T19:51:31+00:00 app[web.1]: Started POST "/" for 50.53.6.156 at 2012-08-21 19:51:31 +0000
2012-08-21T19:51:31+00:00 app[web.1]: Parameters: {"utf8"=>"✓", "authenticity_token"=>"+BYQLzhrfDkUVW8UaHikHpmtGHxpeQ/yF4VByHh9m1I=", "movie"=>{"title"=>"The Running Man", "description"=>"A documentary about a public execution game show.", "year"=>"1987", "genre"=>"science fiction"}, "commit"=>"Create Movie"}
2012-08-21T19:51:31+00:00 app[web.1]: Processing by MoviesController#index as HTML
2012-08-21T19:51:31+00:00 app[web.1]: Rendered movies/index.html.erb within layouts/application (5.1ms)
2012-08-21T19:51:31+00:00 app[web.1]: Completed 200 OK in 9ms (Views: 6.7ms | ActiveRecord: 0.9ms)
2012-08-21T19:51:31+00:00 heroku[router]: POST moviedata.herokuapp.com/ dyno=web.1 queue=0 wait=0ms service=17ms status=200 bytes=3479
在添加记录后,'heroku pg'命令在postgres数据库上显示相同数量的行(11)。
这是一个我学习Rails和Heroku平台的简单应用程序。 要重现这一点,只需访问http://moviedata.herokuapp.com/并点击“新电影”,在表单中输入一些垃圾数据,然后点击“创建电影”。 记录应该保存并显示在首页的列表中,但它不会。
为了能够写入postgres数据库,有没有必要打开,配置或激活? 看起来很奇怪,它可以读取但不写入。 排除日志故障的更好方法?
本地我使用Ruby 1.9.3,Rails,3.2.8,PostgreSQL 9.1.5,SQLite 3.7.9,Heroku Toolbelt 2.30.3。
编辑/更新:我切换本地版本使用psql。 它也遇到了记录未保存的相同问题。 将用户设置为log_statement ='all'/var/log/postgresql/posgresql-9.1.main.log中的登录显示大量选择,但是当尝试添加记录时,日志显示数据库永远不会被命中。
工头显示所发布的数据,如下所示:
22:38:03 web.1 | Started POST "/" for 127.0.0.1 at 2012-08-21 22:38:02 -0700
22:38:03 web.1 | Processing by MoviesController#index as HTML
22:38:03 web.1 | Parameters: {"utf8"=>"✓", "authenticity_token"=>"0AyxRbwl/Kgi05uI1KX8uxVUJjx9ylAA1ltdWgmunm4=", "movie"=>{"title"=>"Army of Darkness", "description"=>"A man fights the living dead using a boomstick.", "year"=>"1997", "genre"=>"horror"}, "commit"=>"Create Movie"}
22:38:03 web.1 | Movie Load (0.8ms) SELECT "movies".* FROM "movies" ORDER BY title
22:38:03 web.1 | Rendered movies/index.html.erb within layouts/application (14.9ms)
失败的提交听起来像是一个很好的解释。 我还不确定如何检查驱动程序是否设置为提交或查看提交失败的方式/时间。
这是一个非常简单的应用程序,没有负载平衡或复杂的配置,并且大部分代码都是由'generate scaffold'命令生成的,但是有可能在db被打到之前有一些违反约束条件。 也许有一种方法可以将Foreman(或Rails)日志级别提升到11? 我也尝试使用thin,并在日志/文件夹中搜索日志文件,除了上面记录的内容外,没有发现任何其他内容。
这听起来很像交易问题,在您工作之后您并未COMMIT
您的交易,所以更改将丢失。 如果您的SQLite驱动程序默认为COMMIT
不执行明确的COMMIT
或回滚而关闭的事务,并且您的Pg驱动程序默认为ROLLBACK
,那么您将获得所描述的行为。 如果SQLite默认默认自动合并每个语句,并且Pg驱动程序默认打开一个事务,则会发生同样的情况。
这是使用相同本地数据库进行测试的许多好理由之一,因为您将要部署到您想要上线的时候进行测试。
如果你在一个普通的Pg实例上,我会告诉你在postgresql.conf
启用log_statement = 'all'
,重新加载Pg,并观察日志。 你不能在Heroku上做到这一点,但你可以通过heroku logs --ps postgres
访问Pg日志。 尝试运行ALTER USER my_heroku_user SET log_statement = 'all';
重新测试并检查日志。
或者,在本地安装Pg。
想到其他不太可能的可能性:
INSERT
, UPDATE
等失败,并且您的应用程序忽略了导致的错误。 再次,不太可能。 DO INSTEAD
规则不符合你的期望,或者BEFORE
触发器返回NULL
,从而无声地将操作转换为空操作。 似乎不太可能,如果你使用SQLite进行测试。 上一篇: Rails App on Heroku Cannot Write to PostgreSQL Database, Only Read