ruby-on-rails - RAILS:用外部约束截断和替换 postgres 表上的数据
问题描述
我正在编写一个 Rails 类,以便在大规模更新后从 PostgreSQL 表中备份和回滚数据,以防出现问题。我的备份脚本生成表记录的 JSON 表示,用于替换在(非常原始的)TRUNCATE 表命令之后执行的最近表修改。
一切都适用于 MySQL,因为可以在 TRUNCATE 命令之前分离任何外部约束。例如:
SET FOREIGN_KEY_CHECKS = 0;
TRUNCATE table my_table;
SET FOREIGN_KEY_CHECKS = 1;
在 PostgreSQL 上,该FOREIGN_KEY_CHECKS
机制似乎并不像 MySQL 那样真正起作用,我们必须在 truncate 命令之前执行一些 Postgres 自动化脚本(看看这个 SO answer)。可以用 Rails 管理那些 PostgreSQL 脚本吗?
实际上我的 Rails 方法是:
def rollback(model, dump_file)
filepath = File.join("#{@path}/#{dump_file}")
abort "Input file not found: #{filepath}" unless File.exist?(filepath)
records = JSON.parse(File.read(filepath))
sql = <<-sql
BEGIN;
ALTER TABLE #{model.table_name} DISABLE TRIGGER ALL;
TRUNCATE #{model.table_name} RESTART IDENTITY;
ALTER TABLE #{model.table_name} ENABLE TRIGGER ALL;
COMMIT;
sql
ActiveRecord::Base.connection.execute(sql)
records.each do |record|
model.create(record)
end
puts "- restored #{records.size} #{model}"
end
解决方案
推荐阅读
- ruby - 如何从 octokit github 客户端为 ruby 获取所有已部署的提交?
- excel - 在excel中聚合重复项
- cypress - 赛普拉斯未捕获的断言错误,尽管 cy.on('uncaught:exception')
- jquery - jquery在动画高度之间切换
- javascript - 删除asp.net mvc中的记录后如何更新视图
- c# - ITextSharp - XMLWorkerHelper.GetInstance().ParseXHtml() 非常慢
- azure - 如何将设备注册到 Azure IOT 中心的组注册?
- ios - 如何将像素转换为 ios 图表中数据的 x 坐标
- bash - 我无法使用“超时命令”获得“退出状态”
- javascript - 'return' 没有输出所有结果