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

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/8795086/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-20 23:32:30  来源:igfitidea点击:

Rails 3.1. Heroku PGError: operator does not exist: character varying = integer

ruby-on-railspostgresqlsqliteheroku

提问by emilsw

Having a little trouble fixing an error.

修复错误有点麻烦。

All works great on local machine. On PG, heroku is the error.

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

Here are the logs :

以下是日志:

  ←[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)

Not really sure where exactly, the error occurs and how to fix it.

不太确定错误发生的确切位置以及如何修复它。

reviews.rb

评论.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

显示.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>

The thing that confuses me is that I have two other practically the same models, but they work well.

让我感到困惑的是,我还有另外两个几乎相同的模型,但它们运行良好。

Thanks!

谢谢!

回答by mu is too short

Your problem is here:

你的问题在这里:

WHERE "reviews"."trip_id" = 32

and the error message says that:

错误消息说:

operator does not exist: character varying = integer

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

so you have created your trip_idcolumn in reviewsas a string rather than as an integer. That will work fine in SQLite because SQLite's type system is rather loose but it won't work in PostgreSQL as PostgreSQL is quite a bit stricter.

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

You could try adding a migration to fix the type of trip_id:

您可以尝试添加迁移来修复以下类型trip_id

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

and if that doesn't work then drop and recreate the table:

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

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

You could also do an ALTER TABLE through raw SQL if you have data that you want to preserve and the change_columndoesn't work:

如果您有要保留的数据并且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

That should work in PostgreSQL (but not SQLite) as long as you don't have any broken data in your trip_id.

只要您的trip_id.

Once you have that sorted out, you should install PostgreSQL and switch your development environment to that. Developing on top of SQLite and deploying to PostgreSQL (or developing on top of one database and deploying on top of any other database for that matter) is a bad idea and will cause you all sorts of grief and confusion.

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

回答by Stew-au

You could leave the column as a text/varchar data type, and cast it as an integer...

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

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

回答by Alessandro DS

A simpler way to do the migration is this:

一种更简单的迁移方法是:

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