ActiveRecord#create不允许设置id
我需要批量插入>100.000条记录。 DB不会创建id,我必须使用给定的UUID: 使用mymodel.new在循环中执行此操作分配ID,然后保存记录将起作用,但速度太慢(大约20分钟) 当我创建一个数组“记录”并使用mymodel.create(记录)时,我遇到了“无法批量分配id”问题。 我已经尝试了我能找到的所有解决方案:ActiveRecord#create不允许设置id,activerecord,mass-assignment,Activerecord,Mass Assignment,我需要批量插入>100.000条记录。 DB不会创建id,我必须使用给定的UUID: 使用mymodel.new在循环中执行此操作分配ID,然后保存记录将起作用,但速度太慢(大约20分钟) 当我创建一个数组“记录”并使用mymodel.create(记录)时,我遇到了“无法批量分配id”问题。 我已经尝试了我能找到的所有解决方案: 模型的“attr_accessible:id,…”。适用于除id以外的所有人 (重新)定义“def self.attributes\u protected\u by
- 模型的“attr_accessible:id,…”。适用于除id以外的所有人
- (重新)定义“def self.attributes\u protected\u by_default[]end”-无效
- 一个建议是使用'create'with':without_protection=>true',但create不接受多个参数
我还能做什么呢?最后,我找到了一个解决方案,虽然在Rails方面可能并不优雅,但它解决了我的性能问题: 起初,我尝试了@Albin建议的方法,结果发现创建(记录)的速度并没有更快(仍然>15分钟) 我现在的解决办法是:
- 创建一个临时CSV文件
db_tmp = File.open("tmp_file", "w") records = "" @data_records.each do |row| records << "#{row['id']},#{row['id']},#{field_1},#{row['field_2']}, ... \n" end db_tmp.write(records) db_tmp.close
另一点是,我的解决方案绕过了为模型定义的任何验证。这不是一个问题,因为在这种情况下,我知道我可以依赖我接收的数据的完整性—如果出现问题,加载将失败,执行将引发异常。记录中的id存储在id列中是否重要?也许可以创建一个
外部\u id
列,并将id插入其中,避免与rails就mass\u分配发生冲突?
sql = "load data infile 'tmp_file' into table my_table
fields optionally enclosed by '\"' terminated by ','
(id,field_1,field_2, ... )"
ActiveRecord::Base.connection.execute(sql)