提问人:jeyraof 提问时间:9/19/2023 更新时间:9/21/2023 访问量:89
从 Rails 迁移文件中提取 RAW SQL
Extracting RAW SQL from Rails Migration file
问:
在 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提取?
答:
2赞
mechnicov
9/19/2023
#1
- 若要进行所有迁移查询,请使用整个文件
db/structure.sql
rails 中有 2 种类型的模式转储: 和db/schema.rb
db/structure.sql
如果需要,请使用原始 SQL,请使用第二个。要启用此功能,请将此行添加到config/application.rb
config.active_record.schema_format = :sql
- 提取给定迁移的 SQL 查询的最简单方法是执行
您可以查看git diff
db/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 指南的链接
评论