使用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
相关产品推荐
相关产品推荐

