迁移触发NoMethodError:jsonb方法未定义,SpinaCMS本地安装迁移失败求助
解决SpinaCMS本地迁移时的MySQL jsonb错误问题
我来帮你搞定这个迁移报错的问题,这本质是个数据库兼容性的坑,咱们一步步来拆解:
错误根源
你碰到的 NoMethodError: undefined method 'jsonb' 问题,核心原因是MySQL不支持PostgreSQL独有的jsonb数据类型。SpinaCMS的迁移文件里用到了jsonb字段,但ActiveRecord的MySQL适配器根本不认这个方法,自然就跑不起来了。至于作为gem安装时能正常运行,大概率是因为gem版本里针对不同数据库做了适配处理,或者你用gem时的数据库环境是PostgreSQL~
可行的解决方案
1. 切换到PostgreSQL(官方推荐,最省心)
SpinaCMS本身就是为PostgreSQL优化的,用它能从根源避免这类问题:
- 先装PostgreSQL(Mac用Homebrew就行:
brew install postgresql) - 启动服务:
brew services start postgresql - 修改项目根目录的
config/database.yml,换成PostgreSQL配置:default: &default adapter: postgresql encoding: unicode pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> development: <<: *default database: spina_development test: <<: *default database: spina_test production: <<: *default database: spina_production username: spina password: <%= ENV['SPINA_DATABASE_PASSWORD'] %> - 最后重新建库跑迁移:
rails db:create rails db:migrate
2. 修改迁移文件适配MySQL(适合非要用MySQL的情况)
如果必须用MySQL,只能手动改迁移文件,把jsonb换成MySQL支持的json类型:
- 找到
db/migrate目录下报错的迁移文件,定位到t.jsonb的代码行 - 把
t.jsonb :xxx替换成t.json :xxx - 注意:MySQL的
json和PostgreSQL的jsonb功能有差异(比如索引支持),可能会影响SpinaCMS的部分功能,得谨慎用
3. 同步gem的兼容逻辑到本地代码
对比你本地克隆的仓库代码和gem版本的代码,看看gem是不是做了MySQL兼容。如果是的话,把gem里的兼容逻辑同步到本地,或者直接用gem的迁移文件替换本地的迁移文件就行。
内容的提问来源于stack exchange,提问作者lastone
相关产品推荐
相关产品推荐

