PGError:运算符不存在:character varying = bigint

时间:2012-07-01 23:45:32

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

我正在尝试与Twitter API交互,以在我的网站上显示user_timeline。

我按照railscasts.com视频进行了Twitter整合:http://railscasts.com/episodes/359-twitter-integration

我正在与API进行交互,将信息提取到我的应用程序中,它正在显示并正在开发中。

我的代码如下:

模型 - timeline.rb

class Timeline < ActiveRecord::Base
  attr_accessible :content, :screen_name, :tweet_id

  def self.pull_tweets
   Twitter.user_timeline("{username_goes_here}", since_id: maximum(:tweet_id)).each do |tweet|
    unless exists?(tweet_id: tweet.id)
      create!(
        tweet_id: tweet.id,
        content: tweet.text,
        screen_name: tweet.user.screen_name,
      )
    end
  end
end
end

以下是迁移:

class CreateTimelines < ActiveRecord::Migration
  def change
    create_table :timelines do |t|
     t.string :tweet_id
     t.string :screen_name
     t.text :content

     t.timestamps
end

端 端

并显示推文:

<div id="timeline">
      <% Timeline.order("tweet_id desc").limit(3).each do |timeline| %>
         <h3><%= timeline.content %></h3>

        <p class="pull-right">
            ~ @<%= timeline.screen_name %>
        </p>
      <% end %>
    </div>

这个想法是将推文存储在数据库中,这样即使Twitter关闭,这也不会影响用户看到最新的推文。

无论如何,当我在控制台中运行命令Timeline.pull_tweets时,它可以正常工作。

当我推送到heroku时,迁移数据库并尝试运行相同的命令。

然后我收到此错误:

  PGError: ERROR:  operator does not exist: character varying = bigint
LINE 1: ...ne FROM "timelines"  WHERE "timelines"."tweet_id" = 21919081...
                                                         ^
HINT:  No operator matches the given name and argument type(s). You might need to add explicit type casts.

对正在发生的事情有任何帮助吗?

我还尝试运行迁移,以便:tweet_id是一个整数,但我在heroku上也遇到了另一个错误。

感谢。

1 个答案:

答案 0 :(得分:2)

您已将tweet_id创建为字符串(PostgreSQL中的AKA varchar(255)):

create_table :timelines do |t|
  t.string :tweet_id

但是你的tweet.id

unless exists?(tweet_id: tweet.id)

实际上是一个数字。如果您想继续将tweet_id存储为字符串,那么您必须将id转换为您使用它的所有地方的字符串:

unless exists?(tweet_id: tweet.id.to_s)
  create!(
    tweet_id: tweet.id.to_s,
    ...

如果要修改生产表以使用tweet_id的整数而不是当前字符串,则可以选择以下几种方法:

  1. 使用正确的架构删除并重新创建表。这样可以正常工作但你会丢失任何数据。
  2. 手动发出ALTER TABLE so that you can use USING告诉PostgreSQL如何将字符串转换为整数。
  3. 一旦你明白了,你应该在本地安装PostgreSQL,并在你计划部署到Heroku时在PostgreSQL之上进行开发。