You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用MySQL数据库执行Devise Trackable模块迁移时报错如何解决

问题原因

你的迁移报错核心原因是混用了数据库专属数据类型:inet是PostgreSQL独有的IP存储类型,你当前使用的MySQL数据库不支持该类型,因此执行add_column时触发SQL语法错误。

修正后的迁移代码
class AddTrackableToDevise < ActiveRecord::Migration[6.1]
  def up
    unless column_exists?(:users, :sign_in_count)
      add_column :users, :sign_in_count, :integer, default: 0, null: false 
    end
    unless column_exists?(:users, :current_sign_in_at)
      add_column :users, :current_sign_in_at, :datetime
    end
    unless column_exists?(:users, :last_sign_in_at)
      add_column :users, :last_sign_in_at, :datetime
    end
    unless column_exists?(:users, :current_sign_in_ip)
      # 替换inet为string类型,长度45兼容IPv4/IPv6格式
      add_column :users, :current_sign_in_ip, :string, limit: 45
    end
    unless column_exists?(:users, :last_sign_in_ip)
      add_column :users, :last_sign_in_ip, :string, limit: 45
    end
  end

  def down
    remove_columns :users, :sign_in_count, :current_sign_in_at, :last_sign_in_at, :current_sign_in_ip, :last_sign_in_ip
  end
end
原理说明
  • 不同数据库支持的数据类型存在差异,inet仅PostgreSQL可用,MySQL存储IP地址用字符串即可满足需求,Devise的Trackable模块本身不会依赖数据库层面的IP类型校验,存字符串完全能实现登录IP记录的功能。
  • 长度设置为45是为了兼容完整IPv6地址的存储:标准IPv6地址最长为39个字符,预留部分冗余空间可应对带子网标识等特殊IP格式的存储需求。

内容的提问来源于stack exchange,提问作者BAVAN M Y

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 11:27:03