非Rails环境下ActiveRecord 5.2数据库迁移执行失败求助
非Rails环境下ActiveRecord 5.2数据库迁移报错解决
问题背景
项目锁定在ActiveRecord 5.2.8.1,非Rails架构,迁移文件存放在自定义路径,执行迁移时触发参数错误。
执行迁移的代码
def self.migrations_path File.expand_path('../schema', __FILE__) end ActiveRecord::MigrationContext.new(migrations_path).migrate(5.2)
ActiveRecord 5.2.8.1报错信息
Failure/Error: ActiveRecord::MigrationContext.new(migrations_path).migrate(5.2) ArgumentError: wrong number of arguments (given 5, expected 1..4)
完整堆栈跟踪
ArgumentError: wrong number of arguments (given 5, expected 1..4) # /usr/share/rvm/gems/ruby-3.0.1/gems/activerecord-5.2.8.1/lib/active_record/connection_adapters/abstract/schema_definitions.rb:263:in `initialize' # /usr/share/rvm/gems/ruby-3.0.1/gems/activerecord-5.2.8.1/lib/active_record/connection_adapters/sqlite3/schema_statements.rb:60:in `new' # /usr/share/rvm/gems/ruby-3.0.1/gems/activerecord-5.2.8.1/lib/active_record/connection_adapters/sqlite3/schema_statements.rb:60:in `create_table_definition' # /usr/share/rvm/gems/ruby-3.0.1/gems/activerecord-5.2.8.1/lib/active_record/connection_adapters/abstract/schema_statements.rb:291:in `create_table' # /usr/share/rvm/gems/ruby-3.0.1/gems/activerecord-5.2.8.1/lib/active_record/schema_migration.rb:29:in `create_table' # /usr/share/rvm/gems/ruby-3.0.1/gems/activerecord-5.2.8.1/lib/active_record/migration.rb:1187:in `initialize' # /usr/share/rvm/gems/ruby-3.0.1/gems/activerecord-5.2.8.1/lib/active_record/migration.rb:1036:in `new' # /usr/share/rvm/gems/ruby-3.0.1/gems/activerecord-5.2.8.1/lib/active_record/migration.rb:1036:in `up' # /usr/share/rvm/gems/rsongkickuby-3.0.1/gems/activerecord-5.2.8.1/lib/active_record/migration.rb:1017:in `migrate' # ./lib/mycompany/oauth2/schema.rb:7:in `migrate' # ./spec/spec_helper.rb:32:in `<top (required)>'
升级到ActiveRecord 6.0后的报错
Failure/Error: ActiveRecord::MigrationContext.new(migrations_path).migrate(6.0) ArgumentError: wrong number of arguments (given 1, expected 2) # /usr/share/rvm/gems/ruby-3.0.1/gems/activerecord-6.0.0/lib/active_record/migration.rb:1028:in `initialize' # ./lib/mycompany/oauth2/schema.rb:7:in `new' # ./lib/mycompany/oauth2/schema.rb:7:in `migrate' # ./spec/spec_helper.rb:32:in `<top (required)>'
解决方案(ActiveRecord 5.2.8.1)
核心错误原因
调用migrate(5.2)时传入的是浮点数,而ActiveRecord 5.2的migrate方法期望接收整数类型的迁移版本号,浮点数在内部调用链路中会被错误拆解为多个参数,最终触发create_table的参数数量不匹配错误。
1. 正确调用migrate方法
- 执行所有迁移到最新版本,直接调用无参
migrate:
ActiveRecord::MigrationContext.new(migrations_path).migrate
- 指定迁移到某个具体版本(比如版本号为20240520120000的迁移),传入整数版本号:
ActiveRecord::MigrationContext.new(migrations_path).migrate(20240520120000)
2. 确保迁移文件格式合规
检查自定义路径下的迁移文件,必须继承自ActiveRecord::Migration[5.2],示例格式:
class CreateUsers < ActiveRecord::Migration[5.2] def change create_table :users do |t| t.string :name t.timestamps end end end
3. 完整迁移执行代码示例
require 'active_record' # 配置数据库连接 ActiveRecord::Base.establish_connection( adapter: 'sqlite3', database: './db/development.sqlite3' ) def self.migrations_path File.expand_path('../schema', __FILE__) end # 执行迁移 ActiveRecord::MigrationContext.new(migrations_path).migrate
ActiveRecord 6.0适配说明
若后续升级到6.0版本,MigrationContext.new需要两个必选参数,需调整为:
ActiveRecord::MigrationContext.new(migrations_path, ActiveRecord::SchemaMigration).migrate
内容的提问来源于stack exchange,提问作者user1022788
相关产品推荐
相关产品推荐

