将Rails应用程序移动到PostgreSQL - 整数超出范围

时间:2013-10-05 04:20:33

标签: ruby-on-rails sqlite postgresql

我已经和我斗争了几天了,我已经停止了取得任何进展。

我开始为我的Rails 4 / Ruby 2.0应用程序开发PostgreSQL。其中很大一部分是将我的数据从Sqlite迁移到PostgreSQL。我的数据量非常大。

我按照Railscast中的说明操作: http://railscasts.com/episodes/342-migrating-to-postgresql

我已经正确运行PostgreSQL。

我在迁移数据时遇到了一些问题,并在Github上发现了这个问题: https://github.com/ricardochimal/taps/issues/128

我按照hak8or提供的说明操作,让我创建一个名为“tmp”的独立简化应用程序来迁移数据。一切似乎都很顺利。转换了数据库模式,并开始复制表。

然后我收到了这个错误:

postgres.rb:175:in `exec': PG::NumericValueOutOfRange: ERROR:  integer out of range (Sequel::DatabaseError)

我做了一些查看我的数据,并意识到我需要将一列更改为bigint。所以我创建并运行了迁移并重新启动了数据迁移。可悲的是,我仍然有同样的错误。

转换似乎按照表格的顺序进行。我检查了下一个应该转换的表,只有两个整数字段。一个是ID,另一个是关系的ID,而且它仍然是空的。

有没有人有任何想法?我完全难过了。

2 个答案:

答案 0 :(得分:0)

经过大量调查后,我发现当我尝试迁移数据时,我更改为“bigint”的列以某种方式被转换回常规整数列。

我发现修复此问题的最简单方法是创建一个“bigint”类型的新列,将Integer列中的信息复制到“bigint”列中,然后删除旧的Integer列。

答案 1 :(得分:-1)

在Ruby on Rails for bigint(Postgre)中使用十进制而不是整数。 像:

  def change
    create_table :profiles do |t|
      t.decimal :mybigfieldnumber
      t.timestamps
    end
  end

而不是:

  def change
    create_table :profiles do |t|
      t.integer :mybigfieldnumber   
      t.timestamps
    end
  end