mirror of
https://github.com/indentlabs/notebook.git
synced 2025-10-26 11:19:22 +00:00
49 lines
1.6 KiB
Ruby
49 lines
1.6 KiB
Ruby
namespace :backups do
|
|
desc "Export all data to CSV"
|
|
task export_to_csv: :environment do
|
|
require 'csv'
|
|
|
|
export_folder = "./export"
|
|
FileUtils.mkdir_p(export_folder) unless File.exists?(export_folder)
|
|
exported_tables = []
|
|
skipped_tables = []
|
|
|
|
puts "Starting CSV export"
|
|
ActiveRecord::Base.connection.tables.each do |table_name|
|
|
file = "#{export_folder}/#{table_name}.csv"
|
|
|
|
begin
|
|
klass = table_name.classify.constantize
|
|
rescue NameError
|
|
# If we can't classify the name (e.g. it's namespaced), try to pull it from ActiveRecord::Base.descendants
|
|
klass = ActiveRecord::Base.descendants.find { |d| d.table_name == table_name }
|
|
|
|
# If we still can't find it, skip it.
|
|
if klass.nil?
|
|
puts " !!! Skipping table #{table_name} (no model)"
|
|
skipped_tables << table_name
|
|
next
|
|
end
|
|
end
|
|
|
|
table = klass.all;0 # ";0" stops output.
|
|
if table.any?
|
|
print " #{"%.3d" % (exported_tables.count + 1)}. Exporting table #{table_name} (#{klass.name}) to #{file}..."
|
|
exported_tables << table_name
|
|
CSV.open( file, 'w' ) do |writer|
|
|
writer << table.first.attributes.map { |a,v| a }
|
|
table.find_each do |s|
|
|
writer << s.attributes.map { |a,v| v }
|
|
end
|
|
end
|
|
puts "Done."
|
|
else
|
|
puts " !!! Skipping table #{table_name} (no data)"
|
|
skipped_tables << table_name
|
|
end
|
|
end
|
|
|
|
puts "Tables exported: #{exported_tables.join(', ')}"
|
|
puts "Tables skipped: #{skipped_tables.join(', ')}"
|
|
end
|
|
end |