もた日記

くだらないことを真面目にやる

Railsメモ(7) : rake db:seedでデータを追加する

追加したいデータをCSVファイルとして出力したのでrake db:seedコマンドを使ってデータを追加してみる。
最初にこれまでに追加したデータを削除しておく。

$ ./bin/rails c
Loading development environment (Rails 4.2.3)
[1] pry(main)> Song.count
   (0.2ms)  SELECT COUNT(*) FROM "songs"
3
[2] pry(main)> Song.delete_all
  SQL (12.8ms)  DELETE FROM "songs"
3
[3] pry(main)> Song.count
   (0.9ms)  SELECT COUNT(*) FROM "songs"
0


db/seeds.rbCSVファイルからデータを読み込んで追加するように編集してコマンドを実行。

require "csv"

CSV.foreach('db/seed_songs.csv') do |row|
  Song.create(title: row[0], display_artist: row[1], ranking: row[2], year: row[3])
end
$ ./bin/rake db:seed
$ ./bin/rails c
Loading development environment (Rails 4.2.3)
[1] pry(main)> Song.count
   (0.8ms)  SELECT COUNT(*) FROM "songs"
2500
[2] pry(main)> Song.all
  Song Load (12.4ms)  SELECT "songs".* FROM "songs"
+------+--------------------------------+--------------------------------+---------+------+-------------------------+-------------------------+
| id   | title                          | display_artist                 | ranking | year | created_at              | updated_at              |
+------+--------------------------------+--------------------------------+---------+------+-------------------------+-------------------------+
| 4    | Hold On                        | Wilson Phillips                | 1       | 1990 | 2015-08-08 06:19:24 UTC | 2015-08-08 06:19:24 UTC |
| 5    | It Must Have Been Love         | Roxette                        | 2       | 1990 | 2015-08-08 06:19:24 UTC | 2015-08-08 06:19:24 UTC |
| 6    | Nothing Compares 2 U           | Sinéad O'Connor                | 3       | 1990 | 2015-08-08 06:19:24 UTC | 2015-08-08 06:19:24 UTC |
| 7    | Poison                         | Bell Biv DeVoe                 | 4       | 1990 | 2015-08-08 06:19:24 UTC | 2015-08-08 06:19:24 UTC |
| 8    | Vogue                          | Madonna                        | 5       | 1990 | 2015-08-08 06:19:24 UTC | 2015-08-08 06:19:24 UTC |
 …省略…

無事にデータは追加されたが、手動で追加した3曲分の情報が完全に削除されてなくidが4から始まっているのが気になる。

idの番号をリセットする方法


rake db:resetすればDBがリセットされるので、idが1から始まるようになるがDBを全部リセットするのはやり過ぎな気がする。
調べたところいろいろな方法があるらしいが、今回は以下のgemを使用してみる。

Gemfileに下記行を追加してbundle installする。

gem 'activerecord-reset-pk-sequence'

このgemを追加するとreset_pk_sequenceメソッドが使えるようになるので、delete_allした後にreset_pk_sequenceすればidがリセットされ1から始まるようになる。
ソースを見たところSQLiteのほかにMySQLPostgreSQLにも対応しているらしい。

[1] pry(main)> Song.delete_all
[2] pry(main)> Song.reset_pk_sequence


CSVファイルからデータを追加できるようになったがrake db:seedの問題として、コマンドを複数回実行すると同じデータが追加されてしまう。
この対策としてseed-fuを使うのがよいらしいので次ステップで試してみる。

パーフェクト Ruby on Rails

パーフェクト Ruby on Rails