Rails 5.1:主键不是BIGINT

时间:2017-03-11 13:13:51

标签: mysql ruby-on-rails ruby database ruby-on-rails-5

使用A = readdlm(download(url),';') rails 5.1.beta1,迁移使用mysql2作为default的主键整数。

我的主键仍然是4位整数

示例:

分贝/迁移/ 20170311112129_create_receipts.rb

BIGINT

尝试将class CreateReceipts < ActiveRecord::Migration[5.1] def change create_table :receipts do |t| t.timestamps null: false end end end 设置为BIGINT5473508900871246157,Rails会引发以下异常:

  

ActiveModel :: RangeError:5473508900871246157超出ActiveModel :: Type :: Integer的范围,限制为4个字节

1 个答案:

答案 0 :(得分:1)

主键在Rails 5.1.beta1中仍然是4字节整数,因为它在主机上不可重现。但是,如果要设置BigInt,即8字节无符号值,则可以尝试以下方式:

案例1:如果您尚未迁移,或者表格中没有数据。对于特定的表,您可以使用:

class CreateReceipts < ActiveRecord::Migration[5.1]
  def change
    create_table :receipts, :id => false do |t|
      t.integer :id, :limit => 8
      t.timestamps null: false
    end
  end
end

案例2 :您已迁移并且不想丢失数据。 在这种情况下,您可以添加新迁移。

rails g migration change_primary_key_to_bigint_on_receipts

并在迁移文件中生成添加

def change
  change_column :receipts, :id, :bigint
end

我在Rails 5.0.2和5.1.beta1中尝试过这种方法,在两个版本中都可以正常工作。

案例3 :您希望为您创建的每个表都设置默认主键作为BigInt,并且不想弄乱迁移文件。 将其添加到config/environment.rb

的底部
ActiveRecord::ConnectionAdapters::MysqlAdapter::NATIVE_DATABASE_TYPES[:primary_key] = "BIGINT UNSIGNED DEFAULT NULL auto_increment PRIMARY KEY"

除了案例2 您还可以使用execute方法更改ID类型

def up
  execute('ALTER TABLE receipts MODIFY COLUMN id BIGINT(8) NOT NULL AUTO_INCREMENT')
end

def down
  raise ActiveRecord::IrreversibleMigration
end

ActiveRecord不支持此功能。这种方法的缺点是,当您回滚迁移时,ActiveRecord会引发错误,因为它不知道如何还原它。