Mysql Rails 5.1:主键不是BIGINT

Mysql Rails 5.1:主键不是BIGINT,mysql,ruby-on-rails,ruby,database,ruby-on-rails-5,Mysql,Ruby On Rails,Ruby,Database,Ruby On Rails 5,使用rails5.1.beta1和mysql2,迁移应该使用BIGINT作为主键整数 我的主键仍然都是4位整数 示例: db/migrate/201703111129_create_receipts.rb class CreateReceipts

使用
rails5.1.beta1
mysql2
,迁移应该使用
BIGINT
作为主键整数

我的主键仍然都是4位整数


示例:

db/migrate/201703111129_create_receipts.rb

class CreateReceipts
尝试将
BIGINT
设置为
id
,Rails引发以下异常:

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


在Rails 5.1.beta1中,主键仍然是4字节整数,因为它在master上不可复制。但是,如果要设置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
并在生成的迁移文件中添加

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会引发错误,因为它不知道如何还原它。

该表的
SHOW CREATE TABLE
将其描述为什么?当我遇到此问题时,这让我很反感。我的数据库使用了
BIGINT
数据类型。将
rails
升级到
5.1.0.rc1
后,它可以正常工作-似乎
ActiveRecord
出现了一些问题。我已经进行了广泛的讨论,在将
rails
升级到
5.1.0.rc1
之后,它运行良好-似乎
ActiveRecord
出现了一些问题。我已经进行了广泛的讨论和讨论
ActiveRecord::ConnectionAdapters::MysqlAdapter::NATIVE_DATABASE_TYPES[:primary_key] = "BIGINT UNSIGNED DEFAULT NULL auto_increment PRIMARY KEY"
def up
  execute('ALTER TABLE receipts MODIFY COLUMN id BIGINT(8) NOT NULL AUTO_INCREMENT')
end

def down
  raise ActiveRecord::IrreversibleMigration
end