首页 > 解决方案 > 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-on-railspostgresql

解决方案


推荐阅读