Rails 8.0升级后SQLite环境下db:schema:load因schema.rb中:size键报错的问题咨询
我最近把Rails从6.1版本升级到了8.0.2,测试环境一直用的是SQLite,结果在GitHub Actions的CI流程里执行bin/rails db:create db:schema:load时直接报错终止了。
具体报错信息如下:
Created database 'db/test.sqlite3'
bin/rails aborted!
ArgumentError: Unknown key: :size. Valid keys are: :limit, :precision, :scale, :default, :null, :collation, :comment, :primary_key, :if_exists, :if_not_exists, :as, :type, :stored
raise ArgumentError.new("Unknown key: #{k.inspect}. Valid keys are: #{valid_keys.map(&:inspect).join(', ')}")
查看我的schema.rb后发现,里面有大量类似这样的配置行:
t.text "content", size: :long
这在旧版Rails里完全正常,但Rails 8.0已经不再认可size这个配置键了。我本来写了个迁移想把size替换成limit,但发现执行db:schema:dump时,Rails还是会给SQLite的大文本列生成size: :long的配置——等于dump出来的schema里带着loader不接受的键,陷入了死循环:手动改schema.rb没用,dump一下就打回原形;写迁移改limit也拦不住SQLite环境下size再次出现。
我的环境配置:
- Ruby 3.3.9
- Rails 8.0.2
- SQLite3 gem 2.0.2
- RSpec 8.0.2
现在想请教几个问题:
- 这是Rails 8的有意改动吗?有没有官方文档对此做说明?
- 推荐的修复方案是什么?
- 我更想保持现有配置的简洁性,不想换成
structure.sql(虽然很多LLM都建议这么做) - 难道只能换掉测试环境的数据库才能解决吗?
- 我更想保持现有配置的简洁性,不想换成
- 有没有兼容Rails 8的方式,能让SQLite和
schema.rb继续正常配合使用?
内容来源于stack exchange

