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

非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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 17:54:59