导轨 3.1。 Heroku PGError:运算符不存在:字符变化=整数

Posted

技术标签:

【中文标题】导轨 3.1。 Heroku PGError:运算符不存在:字符变化=整数【英文标题】:Rails 3.1. Heroku PGError: operator does not exist: character varying = integer 【发布时间】:2012-02-06 09:09:06 【问题描述】:

修复错误有点麻烦。

在本地机器上一切正常。 在 PG 上,heroku 是错误。

这里是日志:

  ←[32m2012-01-09T19:52:24+00:00 app[web.1]:←[0m ActionView::Template::Error (PGEr
  ror: ERROR:  operator does not exist: character varying = integer
  ←[32m2012-01-09T19:52:24+00:00 app[web.1]:←[0m LINE 1: ...T "reviews".* FROM "re
  views"  WHERE "reviews"."trip_id" = 32
  ←[32m2012-01-09T19:52:24+00:00 app[web.1]:←[0m : SELECT "reviews".* FROM "review
  s"  WHERE "reviews"."trip_id" = 32):
  ←[32m2012-01-09T19:52:24+00:00 app[web.1]:←[0m     31:   <div style='display:non
  e'>
  ←[32m2012-01-09T19:52:24+00:00 app[web.1]:←[0m     33:      <% for review in @tr
  ip.reviews %>
  ←[32m2012-01-09T19:52:24+00:00 app[web.1]:←[0m     34:
  ←[32m2012-01-09T19:52:24+00:00 app[web.1]:←[0m     32:    <div id="inline">
  ←[32m2012-01-09T19:52:24+00:00 app[web.1]:←[0m HINT:  No operator matches the gi
  ven name and argument type(s). You might need to add explicit type casts.
  ←[32m2012-01-09T19:52:24+00:00 app[web.1]:←[0m   app/controllers/trips_controlle
  r.rb:21:in `show'
  ←[32m2012-01-09T19:52:24+00:00 app[web.1]:←[0m
  ←[32m2012-01-09T19:52:24+00:00 app[web.1]:←[0m cache: [GET /trips/32] miss
  ←[32m2012-01-09T19:52:24+00:00 app[web.1]:←[0m     36:     <li> <%= review.conte
  nt %> </li>
  ←[32m2012-01-09T19:52:24+00:00 app[web.1]:←[0m     35:     <ul>
  ←[32m2012-01-09T19:52:24+00:00 app[web.1]:←[0m
  ←[32m2012-01-09T19:52:24+00:00 app[web.1]:←[0m   app/views/trips/show.html.erb:3
  3:in `_app_views_trips_show_html_erb__3301405670044045300_69859019468960'
  ←[32m2012-01-09T19:52:24+00:00 app[web.1]:←[0m Completed 500 Internal Server Err
  or in 86ms
  ←[32m2012-01-09T19:52:24+00:00 app[web.1]:←[0m   Parameters: "id"=>"32"
  ←[32m2012-01-09T19:52:24+00:00 app[web.1]:←[0m   Processing by TripsController#s
  how as HTML
  ←[32m2012-01-09T19:52:24+00:00 app[web.1]:←[0m Rendered trips/show.html.erb with
  in layouts/application (81.8ms)

不太确定错误发生在哪里以及如何修复它。

reviews.rb

 class Review < ActiveRecord::Base
  belongs_to :trip
 end

 class Trip < ActiveRecord::Base
  has_many :reviews, :dependent => :destroy
  attr_accessible, :reviews_attributes

  accepts_nested_attributes_for :reviews, :reject_if => lambda  |a| a[:name].blank? , :allow_destroy => true
 end 

show.html.rb

 <%= link_to "Read Reviews", '#inline',  :id => 'various1', :class => 'review' %>  

 <div style='display:none'>  
   <div id="inline">
      <% for review in @trip.reviews %>  
       <ul>
         <li> <%= review.content %> </li>
         <li> <i> <%= review.name %> </i> </li>
       </ul>
     <% end %>  
  </div> 
 </div>

让我感到困惑的是,我还有另外两个几乎相同的模型,但它们工作得很好。

谢谢!

【问题讨论】:

【参考方案1】:

你的问题在这里:

WHERE "reviews"."trip_id" = 32

并且错误消息说:

运算符不存在:字符变化 = 整数

所以您在reviews 中将trip_id 列创建为字符串而不是整数。这在 SQLite 中可以正常工作,因为 SQLite 的类型系统相当松散,但它在 PostgreSQL 中不起作用,因为 PostgreSQL 相当严格。

您可以尝试添加迁移以修复 trip_id 的类型:

def change
  change_column :reviews, :trip_id, :integer
end

如果这不起作用,则删除并重新创建表:

def change
  drop_table :reviews
  create_table :reviews do |t|
    #...
    t.integer :trip_id
    #...
  end
end

如果您有想要保留的数据并且 change_column 不起作用,您也可以通过原始 SQL 执行 ALTER TABLE:

def change
  execute %q
    alter table reviews
    alter column trip_id
    type int using cast(trip_id as int)
  
end

只要您的 trip_id 中没有任何损坏的数据,这应该在 PostgreSQL(但不是 SQLite)中有效。

一旦你解决了这个问题,你应该安装 PostgreSQL 并将你的开发环境切换到那个。在 SQLite 之上开发并部署到 PostgreSQL(或在一个数据库之上开发并在任何其他数据库之上部署)是一个坏主意,并且会给你带来各种痛苦和困惑。

【讨论】:

谢谢!看起来,我在创建模型时输入错误(整数作为字符串)。 在本地没有看到它,因为 sqlite3 可以。没错,是时候在 PG 之上开始开发了。 嘿@mu_is_too_short !已经很长时间了;)问题,我很好奇是否仍然可以使用字符串来执行此操作(如果您真的必须这样做的话)。 @Trip 我认为你必须在其中输入一个类型,或者像下面的 Stew-au 那样在左边的 ::int 或在右边的 ::text (或使用标准的 @ 987654332@ 或 cast(x as text) 语法)。【参考方案2】:

您可以将该列保留为 text/varchar 数据类型,并将其转换为整数...

WHERE "reviews"."trip_id"::int = 32

【讨论】:

【参考方案3】:

进行迁移的更简单方法是:

change_column :reviews, :trip_id, 'integer USING CAST(trip_id AS integer)'

【讨论】:

以上是关于导轨 3.1。 Heroku PGError:运算符不存在:字符变化=整数的主要内容,如果未能解决你的问题,请参考以下文章

导轨 3.1。如何防止 Rails 使用 CoffeeScript?

如何更改 Heroku 中的列类型?

PGError:错误:关系列不存在

我们如何定义大整数? [复制]

使用 Postgres 安装最新版本的 Rails 4 - 不推荐使用 PGconn、PGresult 和 PGError 常量

使用 Rails 3.1 和 Unicorn 在 Heroku 上进行 HTTP 流式传输