【问题标题】:Rails ID sequence after csv import in Heroku PG databaseHeroku PG数据库中csv导入后的Rails ID序列
【发布时间】:2017-04-05 18:13:59
【问题描述】:

我正在为用户创建日记以跟踪他的日常支出。但是,我已经有 csv 文件,其中包含要导入到支出表中的 1751 条记录。我正在通过 rake 任务执行此操作。

导入工作正常。当我在开发(SQLite)中这样做并希望通过创建操作创建新记录时,新记录的 ID 为 1752(这是正确的)。

如果我在生产环境(Heroku/PostgreSQL)中这样做,Postgres 会尝试创建 ID 为 1 的新记录,这显然会导致错误(因为前 1751 个 ID 已被占用)。

我的问题:我该如何解决这个问题,以便 Postgres ID 序列以 ID 1752 而不是 ID 1 开头(就像开发中的 SQLite)?

import_expenditure.rake

require 'csv'

namespace :csv do

  desc "Import CSV Data from Expenditures data"
  task :import_expenditures => :environment do
    Expenditure.delete_all
    csv_file_path = 'db/exp_data.csv'

    CSV.foreach(csv_file_path) do |row|

        Expenditure.create!({
          :id => row[0],
          :day => row[1],
          :value => row[2],  
          :description => row[3],
          :cost_type => row[4],
          :category_id => row[5],
          :user_id => row[6]
        })
        puts "Row added!"

    end
  end
end

【问题讨论】:

    标签: ruby-on-rails postgresql csv import


    【解决方案1】:

    尝试在循环之前添加这一行

    ActiveRecord::Base.connection.execute("SELECT setval('expenditures_id_seq', 1752);"
    

    这将改变id 列的值

    【讨论】:

    • 抱歉,我的评论并没有全部保存。我想通过 csv 导入将数据上传到数据库(1751 条记录最初填充数据库),然后定期使用该应用程序(通过“新”视图中的表单添加新记录)。但是,当我第一次上传 1751 条记录(生成从 1 到 1751 的 ID)并且之后想要使用标准表单添加记录时,PG 尝试以 ID = 1 开始保存这些记录(就像我不会上传任何之前的数据)。在开发中,SQLite 确实添加了这些以 ID 1752 开头的新记录。
    • 我相信您的解决方案(将代码放在 rake 中)旨在告诉 PG 在执行 import_expenditure.rake 期间从 ID 1752 开始,对吗?
    • 是的,所以你可以在导入后运行它
    猜你喜欢
    • 1970-01-01
    • 2013-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多