是否可以输出'rake db:migrate'生成的SQL更改脚本?
答案 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