使用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
设置为BIGINT
为5473508900871246157
,Rails会引发以下异常:
ActiveModel :: RangeError:5473508900871246157超出ActiveModel :: Type :: Integer的范围,限制为4个字节
答案 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会引发错误,因为它不知道如何还原它。