Kiba真的很酷!
我正在尝试在Rails应用程序中设置ETL流程,在该流程中,我将从SQL DB中将大量数据转储到CSV文件中。如果我自己实现此目的,我会使用类似find_each
的方式一次加载1000条记录,并将它们批量写入文件中。有没有办法使用Kiba做到这一点?根据我的理解,默认情况下,来自“源”的所有rows
都会传递到“目标”,这对我来说是不可行的。
答案 0 :(得分:1)
很高兴您喜欢Kiba!
我将通过声明您的理解不正确来使您高兴。
行在Kiba中逐行生成和处理。
要了解一切如何正常工作,建议您尝试以下代码:
class MySource
def initialize(enumerable)
@enumerable = enumerable
end
def each
@enumerable.each do |item|
puts "Source is reading #{item}"
yield item
end
end
end
class MyDestination
def write(row)
puts "Destination is writing #{row}"
end
end
source MySource, (1..10)
destination MyDestination
运行此命令,您将看到先读后写每个项目。
现在有了实际的具体案例-上面的内容意味着您可以通过以下方式实现您的源代码:
class ActiveRecord
def initialize(model:)
@model = model
end
def each
@model.find_each do |record|
yield record
end
end
end
然后您可以像这样使用它:
source ActiveRecordSource, model: Person.where("age > 21")
(如果您希望每一行都是多个记录的数组,那么也可以利用find_in_batches
,但这可能不是您所需要的)。
希望这能正确回答您的问题!