【问题标题】:How do I migrate a database column from integer to bigint in rails?如何在 Rails 中将数据库列从整数迁移到 bigint?
【发布时间】:2015-10-20 00:29:38
【问题描述】:

根据我的发现,我现在正在使用它,但它不起作用......

def change
 change_column :users, :twitter_id, :integer, :limit => 8
end

【问题讨论】:

  • 那没有回答这个问题。我问的是如何设置数据类型,而不是如何更改主键。这些问题的答案集中在主键上,而不是数据类型上。
  • 抱歉,“重复”可能太强了。我想知道是否复制他们将字符串 "bigint" 作为类型放入的模式是否可以满足您的需求
  • 我试过了,不幸的是,它没有用。我收到关于 rake db:migrate 的错误
  • 不过,如果有人知道如何通过更改来做到这一点,我会将其标记为正确答案。做我所做的事情解决了这个问题,但并不能真正回答这个问题,因为它不会帮助任何在游戏后期遇到这个问题的人,因为他们不能只是从他们的数据库中删除一个表

标签: ruby-on-rails-4 activerecord


【解决方案1】:

我刚刚遇到了同样的问题。以下对我有用:

def up 
  change_column :my_table, :my_column, :bigint
end

【讨论】:

  • 这只是改变架构,还是会更新表中的每一行? IE。它会锁定我的桌子吗?
  • 这样做并没有锁定我的桌子。老实说,我没有检查是否每一行都被改变了,或者只是模式被改变了。它可以无缝运行,因此我无需深入研究。
  • 它确实会锁定表。我很确定它也在改变每一行。我在测试迁移之前添加了几千万条记录,在迁移过程中我无法插入表,这需要几个小时。对于任何寻求零停机时间的人,我找到了这个答案:stackoverflow.com/questions/33504982/…
  • 你能帮我处理小整数吗?
  • @ForamThakral 看我的回答
【解决方案2】:

根据ActiveRecord type of integer (tinyint, smallint, mediumint, int, bigint),对于寻找与:bigint 不同的数据类型的任何人,您也可以使用:tinyint:smallint:mediumint

# activerecord-3.0.0/lib/active_record/connection_adapters/mysql_adapter.rb
# Maps logical Rails types to MySQL-specific data types.
def type_to_sql(type, limit = nil, precision = nil, scale = nil)
  return super unless type.to_s == 'integer'

  case limit
  when 1; 'tinyint'
  when 2; 'smallint'
  when 3; 'mediumint'
  when nil, 4, 11; 'int(11)'  # compatibility with MySQL default
  when 5..8; 'bigint'
  else raise(ActiveRecordError, "No integer type has byte size #{limit}")
  end
end

另外,请使用updown 表示rails db:rollback;这对我有用:

class ChangeCarNumberOfKeysToSmallInt < ActiveRecord::Migration[5.2]
  def up
    change_column :cars, :number_of_keys, :tinyint
  end

  def down
    change_column :cars, :number_of_keys, :int
  end
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-04
    • 2012-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-16
    • 2012-01-20
    • 2011-10-26
    相关资源
    最近更新 更多