使用Padrino+SQLite3+ActiveRecord执行迁移/Schema导出时报错求助
解决Padrino+ActiveRecord迁移/Schema导出报错问题
核心原因
你的问题源于Padrino内置的ActiveRecord rake任务与当前使用的ActiveRecord版本不兼容。ActiveRecord在大版本迭代中调整了SchemaMigration类的方法以及连接池的API,而Padrino的任务逻辑未同步适配这些变更,导致调用了已被移除或修改的方法。
解决方案
1. 锁定兼容的ActiveRecord版本
Padrino对ActiveRecord的支持有明确的版本匹配要求,根据你使用的Padrino版本调整AR版本:
- Padrino 0.15.x 适配 ActiveRecord 6.x 系列
- Padrino 0.14.x 适配 ActiveRecord 5.x 系列
修改项目的Gemfile,指定对应版本:
# 对应Padrino 0.15.x gem 'activerecord', '~> 6.1.7' # 或对应Padrino 0.14.x gem 'activerecord', '~> 5.2.8'
执行命令更新依赖:
bundle update activerecord
2. 替代方案:使用ActiveRecord原生命令
Padrino的AR任务是对AR原生命令的封装,你可以直接跳过Padrino的封装,使用AR原生rake命令:
# 执行数据库迁移 bundle exec rake db:migrate # 导出Schema文件 bundle exec rake db:schema:dump
执行前确保PADRINO_ENV环境变量设置正确(比如PADRINO_ENV=development),且config/database.yml中的SQLite3配置路径可读写:
development: adapter: sqlite3 database: db/development.sqlite3 pool: 5 timeout: 5000
3. 手动修复Padrino任务(仅当无法降级AR时使用)
如果必须使用高版本ActiveRecord,可手动修改Padrino的AR任务代码:
- 针对
ar:migrate的create_table错误:
替换@schema_migration.create_table为直接通过连接创建表:ActiveRecord::Base.connection.create_table :schema_migrations, id: false do |t| t.string :version, null: false end ActiveRecord::Base.connection.add_index :schema_migrations, :version, unique: true - 针对
ar:schema:dump的with_connection错误:
将pool.with_connection替换为ActiveRecord::Base.connection,或使用适配器的raw_connection方法执行操作。
验证
完成上述操作后,重新运行迁移命令:
padrino rake ar:migrate
若仍有问题,检查SQLite3数据库文件所在目录的读写权限,确保进程有权限创建或修改数据库文件。
内容的提问来源于stack exchange,提问作者user29559775
相关产品推荐
相关产品推荐

