【问题标题】:how to create migration on rails with raw sql (postgres) with large data set如何使用具有大型数据集的原始 sql(postgres)在 Rails 上创建迁移
【发布时间】:2019-12-27 00:12:28
【问题描述】:

我想将数据插入到相关表中。一对多的关系。在搜索了最佳实践之后,我找到了这个link,然后我实现了这个。

class InsertDataIntoPermissionAndPermissionGroup < ActiveRecord::Migration

  def up
    execute <<-SQL
    -- ----------------------------------------------------------------------------
    WITH a AS (
      INSERT INTO spree_permission_groups (name, created_at, updated_at)
      VALUES ('role_manager', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP) RETURNING id
      ) 
    INSERT INTO 
      spree_permissions (name, action, permission_group_id, created_at, updated_at)
      SELECT 'Role', 'manage', id, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP FROM a
    -- ----------------------------------------------------------------------------

    -- ----------------------------------------------------------------------------
    WITH b AS (
      INSERT INTO spree_permission_groups (name, created_at, updated_at)
      VALUES ('department_manager', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP) RETURNING id
      ) 
    INSERT INTO 
      spree_permissions (name, action, permission_group_id, created_at, updated_at)
      SELECT 'Department', 'manage', id, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP FROM b
    -- ----------------------------------------------------------------------------

    -- ----------------------------------------------------------------------------
    WITH c AS (
      INSERT INTO spree_permission_groups (name, created_at, updated_at)
      VALUES ('holiday_manager', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP) RETURNING id
      ) 
    INSERT INTO 
      spree_permissions (name, action, permission_group_id, created_at, updated_at)
      SELECT 'Holiday', 'manage', id, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP FROM c
    -- ----------------------------------------------------------------------------
    SQL
  end

  def down
    raise ActiveRecord::IrreversibleMigration
  end
end

但我有 300 多个数据。这仍然是正确的做法吗?或者我可以导入一个 excel 数据并执行 rails create 方法。

我也有一个错误。认为这没问题,因为我将它包装在 sql 中。

Caused by:
PG::SyntaxError: ERROR:  syntax error at or near "WITH"
LINE 14:     WITH b AS (
             ^

更新

修正错误

【问题讨论】:

  • 为什么要在迁移中插入它们?,你可以在 rake 任务中插入记录吧?
  • @Aarthi 我们真的没有,因为这只会做一次。这是错的吗?
  • @Aarthi 对此表示感谢。这是一个伟大的博客。我会和我的前辈讨论这个问题。他是建议迁移的人。
  • 当然,这取决于用例。还有另一种填充数据的选项。看看这个xyzpub.com/en/ruby-on-rails/3.2/seed_rb.html

标签: ruby-on-rails postgresql migration rails-migrations


【解决方案1】:

我建议你在 rake 任务中插入记录。您可以使用 Active Record import gem(https://github.com/zdennis/activerecord-import) 将批量数据插入到表中。 您甚至可以在迁移中使用活动记录导入。请检查 gem 文档以使用更多可用选项。

要创建 rake 任务,可以参考这个 - https://railsguides.net/how-to-generate-rake-task/

        desc 'task description'
        task :bulk_insert_records => :environment do |_, args|

          spree_permission_groups = ['holiday_manager', 'department_manager', 'role_manager']

          spree_permission_groups_list = []

          spree_permission_groups.each do |spree_permission_group|
            spree_permission_groups_list << SpreePermissionGroup.new(name: spree_permission_group)
          end

          SpreePermissionGroup.import(spree_permission_groups_list)


         # Likewise use the id of the created records to set permissions
        end

【讨论】:

    猜你喜欢
    • 2011-02-11
    • 1970-01-01
    • 1970-01-01
    • 2011-01-17
    • 2011-12-19
    • 1970-01-01
    • 2020-08-22
    • 1970-01-01
    • 2017-02-21
    相关资源
    最近更新 更多