从 Rails 迁移文件中提取 RAW SQL

Extracting RAW SQL from Rails Migration file

提问人:jeyraof 提问时间:9/19/2023 更新时间:9/21/2023 访问量:89

问:

在 Rails 迁移中,我必须从 rails 迁移文件中提取 RAW SQL,而无需迁移。

这是转换示例:

在 rails 迁移中:

# 20230918004257_add_some_column_to_table.rb
class AddSomeColumnToTable < ActiveRecord::Migration[6.1]
  def change
    add_column :table, :column_a, :string, comment: 'column a'
    add_column :table, :column_b, :string, comment: 'column b'
    add_column :table, :column_c, :string, comment: 'column c'
  end
end

提取的 SQL:

ALTER TABLE `table` ADD `column_a` varchar(255) COMMENT 'column_a';
ALTER TABLE `table` ADD `column_b` varchar(255) COMMENT 'column_b';
ALTER TABLE `table` ADD `column_c` varchar(255) COMMENT 'column_c';

无论我在 ActiveRecord::Migration 中查看多少,我都看不到一种简单地提取 sql 而不做任何其他事情的方法。我怎样才能只做一个简单的sql提取?

MySQL 的Ruby-on-Rails Ruby

评论

0赞 mechnicov 9/19/2023
您需要只针对一个文件获取 SQL 查询还是针对所有文件获取 SQL 查询?
0赞 max 9/19/2023
哪个方向?
0赞 jeyraof 9/19/2023
@mechnicov一个迁移文件。
0赞 jeyraof 9/19/2023
@max 大多数时候,你需要向上方向,但当然,如果可能的话,你也希望能够提取向下方向。
1赞 Benjamin Scharbau 9/19/2023
你到底需要这个做什么?并不是说我想问你,但你的用例可能有助于回答

答:

2赞 mechnicov 9/19/2023 #1
  1. 若要进行所有迁移查询,请使用整个文件db/structure.sql

rails 中有 2 种类型的模式转储: 和db/schema.rbdb/structure.sql

如果需要,请使用原始 SQL,请使用第二个。要启用此功能,请将此行添加到config/application.rb

config.active_record.schema_format = :sql
  1. 提取给定迁移的 SQL 查询的最简单方法是执行

您可以查看git diffdb/structure.sql

从控制台运行迁移并复制输出的另一种方法

require Rails.root.join("db/migrate/20230918004257_add_some_column_to_table.rb")

AddSomeColumnToTable.new.migrate(:up)

# or like this if needed
AddSomeColumnToTable.migrate(:down)

为了防止数据库的实际更新,您可以使用事务包装此代码并回滚它

ActiveRecord::Base.transaction do
  AddSomeColumnToTable.migrate(:up)
  raise # or more elegant: raise ActiveRecord::Rollback
end

也可以在 rails 控制台沙箱中调用此方法(所有更改将在退出时回滚),以进入此模式

rails c -s

评论

0赞 Les Nightingill 9/19/2023
似乎这些策略需要运行主题迁移,我错了吗?OP 在不运行迁移的情况下请求 SQL。
0赞 mechnicov 9/19/2023
是的。迁移没有简单的 API 方法to_sql
0赞 jeyraof 9/19/2023
谢谢@mechnicov。但是我只想在不迁移的情况下将 rails 迁移文件转换为 sql。像上面提到的 ,通常用于创建查询。to_sql
0赞 jeyraof 9/21/2023
我不知道沙盒模式,谢谢。我会寻找它。
0赞 mechnicov 9/21/2023
@jeyraof 我已经添加了指向答案的 rails 指南的链接