【问题标题】:Trouble deploying to Heroku部署到 Heroku 时遇到问题
【发布时间】:2012-03-05 19:20:31
【问题描述】:

嗨,过去几天我一直在尝试将我的 ruby​​ on rails 应用程序部署到 Heroku,我收到此错误“我们很抱歉,但出了点问题。我们已收到有关此问题的通知,我们将一会儿看一下”。即使我遵循 Heroku 指南,我也会检查 Heroku 日志,这就是它所说的:

2012-03-05T18:59:41+00:00 app[web.1]:   Processing by StoreController#index as HTML
2012-03-05T18:59:41+00:00 app[web.1]: Rendered store/index.html.erb within    layouts/application (66.7ms)
2012-03-05T18:59:41+00:00 app[web.1]: Completed 500 Internal Server Error in 164ms
2012-03-05T18:59:41+00:00 app[web.1]: 
2012-03-05T18:59:41+00:00 app[web.1]: ActionView::Template::Error (PG::Error: ERROR:  column "name" does not exist
2012-03-05T18:59:41+00:00 app[web.1]: LINE 1: SELECT "products".* FROM "products"  ORDER BY Name
2012-03-05T18:59:41+00:00 app[web.1]:                                                       ^
2012-03-05T18:59:41+00:00 app[web.1]: : SELECT "products".* FROM "products"  ORDER BY Name):
2012-03-05T18:59:41+00:00 app[web.1]:     2: <p id= "notice"><%= notice %></p>
2012-03-05T18:59:41+00:00 app[web.1]:     3: <% end %>
2012-03-05T18:59:41+00:00 app[web.1]:     8:        
2012-03-05T18:59:41+00:00 app[web.1]:     6:    <div class ="entry">
2012-03-05T18:59:41+00:00 app[web.1]:   app/views/store/index.html.erb:5:in `_app_views_store_index_html_erb___635623125359494649_35532040'
2012-03-05T18:59:41+00:00 app[web.1]:     7:        <div class="img">
2012-03-05T18:59:41+00:00 app[web.1]:     5: <% @products.each do |product| %>
2012-03-05T18:59:41+00:00 app[web.1]: 
2012-03-05T18:59:41+00:00 app[web.1]:     4: 
2012-03-05T18:59:41+00:00 app[web.1]: 
2012-03-05T18:59:41+00:00 app[web.1]: cache: [GET /] miss

由于它在本地运行良好,可能是什么问题?难道是因为我使用 SQLite3 作为我的数据库进行测试和开发,而 Heroku 使用的是 PostgreSQL?

【问题讨论】:

  • 当你说它在本地工作时,你的意思是你已经在本地测试过生产环境,还是你在谈论你的开发环境?

标签: ruby-on-rails sqlite postgresql activerecord heroku


【解决方案1】:

让我们仔细看看你的错误:

ActionView::Template::Error (PG::Error: ERROR:  column "name" does not exist
LINE 1: SELECT "products".* FROM "products"  ORDER BY Name
                                                      ^

大写但未引用的Name非常可疑; SQL 标识符是不区分大小写的,除非你引用它们(它们应该被规范化为大写,但 PostgreSQL 被规范化为小写)。所以,这些表都是一样的:

create table t (name varchar(255));
create table t (Name varchar(255));
create table t (nAmE varchar(255));
create table t (NAME varchar(255));

但这些都是不同的:

create table t ("name" varchar(255));
create table t ("Name" varchar(255));
create table t ("nAmE" varchar(255));
create table t ("NAME" varchar(255));

我猜你已经用"Name" 列而不是name 列创建了你的表。我建议使用小写 name 列重新创建您的表格;或者,您可以在致电order 时引用该列:

Model.where(...).order('"Name"')

但实际上,使用小写的列名会让您的生活更轻松,维护您的代码的人会对您有更美好的回忆。

您在其他地方的 cmets 中注意到您在 SQLite 上进行开发但部署到 PostgreSQL。 SQLite 似乎忽略了列名中的大小写,即使它们被引用:

sqlite> create table t ("Name" text);
sqlite> insert into t values ('a');
sqlite> select * from t order by name;
Name
a

所以在 SQLite 中一切都会正常工作。然而,PostgreSQL 会注意引用标识符的情况(正如 SQL 规范所说的那样),因此如果列在创建时被引用(例如 create table t ("Name" varchar...),ORDER BY Name 将失败。

SQLite 和 PostgreSQL 之间还有其他区别。 ActiveRecord 无法保护您免受数据库之间所有差异的影响,因此您应该始终使用相同的堆栈进行开发、测试和部署(一直到数据库版本)。

【讨论】:

    【解决方案2】:

    看来您可能需要迁移。

    heroku run rake db:migrate
    

    【讨论】:

      【解决方案3】:
      • 你的git status 干净吗?
      • 如果有,你最近有git push heroku master吗?

      确保您的代码已提交并推送。然后你会想要运行迁移。

      【讨论】:

      • 我已经按照你说的做了 git status # 在分支 master 上没有提交(工作目录干净) git push heroku master 一切都是最新的 heroku run rake db:migrate Running rake db:migrate连接到终端...启动,运行。1 我仍然遇到同样的错误
      • 那么您在运行迁移时是否收到错误消息?另外,您能否在您的 db/schema.rb 中确认 products 表确实有一个名称列?
      • 是的,它确实有一个名称列,不,我在编译时没有收到错误。难道是因为我使用 sqlite3 作为我的数据库进行测试和开发,但是对于 heroku,它使用 postgresql。如果是这种情况,最好在本地迁移到 postgresql,然后再次尝试推送。
      猜你喜欢
      • 2018-10-31
      • 2012-05-19
      • 2019-02-18
      • 1970-01-01
      • 2021-01-20
      • 2016-08-27
      • 2021-11-08
      • 1970-01-01
      相关资源
      最近更新 更多