HeartSeed

seed util (convert excel to yaml and insert yaml to db)

Require

Installation

Add this line to your application’s Gemfile:

gem 'heart_seed'

And then execute:

$ bundle

Or install it yourself as:

$ gem install heart_seed

xls support

If you want to use .xls file (NOT .xlsx file), gem install (or write to Gemfile) roo-xls too

see License![#license]

Usage

  1. bundle exec rake heart_seed:init

    • create config/heart_seed.yml, db/xls, db/seeds

    • append to db/seeds.rb

  2. Create xls

  3. bundle exec rake heart_seed:xls

    • Generate yml to db/seeds

    • If you want to specify files: FILES=comments_and_likes.xls SHEETS=comments,likes bundle exec rake heart_seed:xls

  4. bundle exec rake db:seed or bundle exec rake heart_seed:db:seed

    • Import yml to db

    • Exists TABLES, CATALOGS options

examples

TABLES=articles,comments bundle exec rake db:seed
CATALOGS=article,user bundle exec rake db:seed

not Rails

append this to Rakefile

require 'heart_seed/tasks'

Note

  • if production db:seed, require ENV["TABLES"] or ENV["CATALOGS"]

Snippets

config/heart_seed.yml

seed_dir: db/seeds
xls_dir: db/xls
catalogs:
#  user:
#  - users
#  - user_profiles

db/seeds.rb

# Appended by `rake heart_seed:init`
HeartSeed::DbSeed.import_all

# If you want to insert by ActiveRecord, replase like this.
HeartSeed::DbSeed.import_all(mode: HeartSeed::DbSeed::ACTIVE_RECORD)

# If you want to skip model validation in insert, add `validate: false` (default is true)
HeartSeed::DbSeed.import_all(validate: true)

Specification

Supported xls/xlsx format

Example sheet

id | title | description | created_at | | this is dummy — | —— | ———— | ————– | — | ————– 1 | title1 | description1 | 2014/6/1 12:10 | | foo 2 | title2 | description2 | 2014/6/2 12:10 | | baz

  • Sheet name is mapped table name

  • If sheet name is not found in database, this is ignored

  • 1st row : table column names

  • If the spaces are included in the middle, right columns are ignored

  • 2nd row ~ : records

  • ActiveSupport::TimeWithZone is used for timezone

Yaml format

example

---
articles_1:
  id: 1
  title: title1
  description: description1
  created_at: '2014-06-01 12:10:00 +0900'
articles_2:
  id: 2
  title: title2
  description: description2
  created_at: '2014-06-02 12:10:00 +0900'

Catalog

Catalog is table groups defined in heart_seed.yml

example

catalogs:
  user:
  - users
  - user_profiles

user catalog = users, user_profiles tables

You can specify the catalogs at db:seed task

CATALOGS=user bundle exec rake db:seed
# same to) TABLES=users,user_profiles bundle exec rake db:seed

Shard DB

When you use shard DB, write like this to db/seeds.rb.

Rails example

SHARD_NAMES = %W(
  #{Rails.env}
  shard_#{Rails.env}
  shard2_#{Rails.env}
)
HeartSeed::DbSeed.import_all_with_shards(shard_names: SHARD_NAMES)

Insert Mode

MODE=(bulk|active_record|update) bundle exec rake db:seed
  • bulk(default): using bulk insert. (delete_all and BULK INSERT)

  • active_record: import with ActiveRecord. (delete_all and create!)

  • update: import with ActiveRecord. (if exists same record, update!, otherwise create!)

License

While heart_seed is licensed under the MIT license, please note that the ‘spreadsheet’ gem is released under the GPLv3 license.

Contributing

  1. Fork it ( github.com/sue445/heart_seed/fork )

  2. Create your feature branch (git checkout -b my-new-feature)

  3. Commit your changes (git commit -am 'Add some feature')

  4. Push to the branch (git push origin my-new-feature)

  5. Create a new Pull Request