是否可以输出'rake db:migrate'生成的SQL更改脚本?

时间:2010-11-04 19:32:55

标签: ruby-on-rails

是否可以输出'rake db:migrate'生成的SQL更改脚本?

5 个答案:

答案 0 :(得分:76)

在@qarol上构建,但更酷,将此Rake任务添加到您的一个Rake文件中:

task :log => :environment do
  ActiveRecord::Base.logger = Logger.new(STDOUT)
end

然后你可以调用 ANY Rake任务并记录输出:

rake log db:migrate

答案 1 :(得分:35)

您可以在lib/tasks/中创建一个Rake任务:

namespace :db do
  desc 'Make migration with output'
  task(:migrate_with_sql => :environment) do
    ActiveRecord::Base.logger = Logger.new(STDOUT)
    Rake::Task['db:migrate'].invoke
  end
end

然后致电rake db:migrate_with_sql以记录迁移。

答案 2 :(得分:9)

在您的环境日志文件中捕获SQL输出,例如development.log

答案 3 :(得分:2)

为此,我整理了capture_migration_sql宝石。它将您的迁移SQL转储到db/migration_sql中的文件中。

如果只需要查找一个SQL语句,那就太过分了,但是如果您的生产过程需要原始SQL语句,那就太好了。由于不需要ruby->需要SQL心理数学,因此它也可以使在代码审查中复查复杂的数据库更改更加容易。

答案 4 :(得分:1)

您可以像这样在rails console中运行预览SQL:

ActiveRecord::Base.connection.change_table(:events) do |t|
  t.integer :submission_id, default: 5, null: false
end
#=> ALTER TABLE `events` ADD `submission_id` int DEFAULT 5 NOT NULL

因此,只需在常规迁移方法前加上ActiveRecord::Base.connection.,您就可以开始使用

还有rails console --sandbox模式,该模式在您关闭控制台后会回滚更改。尽管检查它是否适用于您的项目,但是对于我们使用Rails 5 + MySQL的项目,它不会回滚DDL更改。


如果准备好迁移文件,则也可以直接运行它:

ActiveRecord::MigrationContext.new("db/migrate").migrate
ActiveRecord::MigrationContext.new("db/migrate").rollback