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

Bla*_*man 42 ruby-on-rails

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

Jos*_*osh 80

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

task :log => :environment do
  ActiveRecord::Base.logger = Logger.new(STDOUT)
end
Run Code Online (Sandbox Code Playgroud)

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

rake log db:migrate
Run Code Online (Sandbox Code Playgroud)

  • 这很有效,而且更通用.这应该是公认的答案. (8认同)
  • 将此脚本放入名为“log_migration.rake”(或其他)的新文件中,并将其放入“lib/tasks”目录中 (2认同)

qar*_*rol 37

您可以在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
Run Code Online (Sandbox Code Playgroud)

然后调用rake db:migrate_with_sql以记录迁移.

  • `ActiveRecord::Base.logger = Logger.new(STDOUT)` 很神奇,运行特定的迁移只需要事先设置记录器:) (3认同)

小智 11

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


小智 6

为此,我将capture_migration_sql gem放在一起。它将您的迁移 SQL 转储到db/migration_sql.

如果您只需要查找单个 SQL 语句,这是一种矫枉过正的做法,但如果您的生产过程需要原始 SQL 语句,那就太好了。它还可以使在代码审查中审查复杂的数据库更改更容易一些,因为不需要 ruby​​ -> SQL 心算。


Lev*_*sky 5

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

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
Run Code Online (Sandbox Code Playgroud)

因此,只需在普通迁移方法前面加上ActiveRecord::Base.connection.,就可以开始了。

还有一种rails console --sandbox模式可以在关闭控制台后回滚更改。虽然检查它是否适用于您的项目,但不知何故,对于我们使用 Rails 5 + MySQL 的项目,它不会回滚 DDL 更改。


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

ActiveRecord::MigrationContext.new("db/migrate").migrate
ActiveRecord::MigrationContext.new("db/migrate").rollback
Run Code Online (Sandbox Code Playgroud)