我有以下代码将数据库A(shard_A)中的图像表中的数据复制到数据库B中的另一个表(shard_B)
以下是两个数据库中图像表的结构
Image table (shard_A) - Image table (shard_B)
- image_id - image_id
- submission_fk - sub_fk
- image_desc - img_desc
2个表的列名略有不同
@test_shard_A = Image.using(:shard_A).find(:first, :conditions => ["submission_fk =?", @sub.id ])
Octopus.using(:shard_B) do
Image.create(
:image_id => @test_shard_A.image_id,
:sub_fk => @test_shard_A.submission_fk,
:img_desc => @test_shard_A.image_desc
) do |primary|
primary.img_id = @test_shard_A.image_id
end
end
上面给出了以下错误消息:
unknown attribute: sub_fk
我做错了什么?
答案 0 :(得分:1)
ActiveRecord在为表执行第一个查询时加载元数据(表信息)。当您通过查询shard_A启动应用程序时,它会检查表结构,并使用submission_fk根据它构造您的Image类。
当您更改分片时,它不会再次检查表结构,因此它假定有一个submission_fk,并且假设没有sub_fk,因为它不知道它。
我建议你对所有分片使用相同的结构,但是如果你不能这样做,你可以强迫ActiveRecord reload the table information - 我从未使用过Octopus,但我认为它会起作用:
Image.reset_column_information
请注意,它会降低应用程序的性能,因为重新加载元数据的操作很慢。