coderdojo-japan / coderdojo.jp

☯️ CoderDojo Japan (@coderdojo-japan) official website developed by Ruby on Rails with @YassLab team. 💎
https://coderdojo.jp
Other
61 stars 102 forks source link

セットアップ時に dojos:update_db_by_yaml を使うと id の追加で失敗する #358

Open yasulab opened 6 years ago

yasulab commented 6 years ago

@nalabjp もしご存知だったら伺いたいんですが、coderdojo.jp を clone して Heroku から DB を pull した状態で $ dojos:update_db_by_yaml を実行すると次のようなエラーが出てくるようになるんですよね🤔 (なんでだろう...?)

Caused by:
PG::UniqueViolation: ERROR:  duplicate key value violates unique constraint "dojos_pkey"
DETAIL:  Key (id)=(149) already exists.
/Users/yasulab/coderdojo.jp/lib/tasks/dojos.rake:43:in `block (3 levels) in <top (required)>'
/Users/yasulab/coderdojo.jp/lib/tasks/dojos.rake:29:in `each'
/Users/yasulab/coderdojo.jp/lib/tasks/dojos.rake:29:in `block (2 levels) in <top (required)>'
bin/rails:4:in `require'
bin/rails:4:in `<main>'
Tasks: TOP => dojos:update_db_by_yaml
(See full trace by running task with --trace

一応ワークアラウンドな対応としては、ひたすら $ dojos:update_db_by_yaml を実行すればそのうち already exists ではない Key に至るので、適当に成功するまで while : ; do i=$((i+1)) ; be rails dojos:update_db_by_yaml ; done を実行していたりします 😅

.oO(ID のイテレータの初期値がおかしいのかなぁ)

nalabjp commented 6 years ago

@yasulab ID指定してレコードを作るとシーケンスが上がらないみたいですね。 既に作成済みのDBに対して$ dojos:update_db_by_yamlを実行しているという状況でしょうか?

yasulab commented 6 years ago

@nalabjp

既に作成済みのDBに対して$ dojos:update_db_by_yamlを実行しているという状況でしょうか?

ですね! 本番環境のDBを $ heroku pg:pull DATABASE_URL coderdojo_jp_development --app coderdojo-japan で取得してから実行しています! 📥 ☁️

shishi commented 6 years ago

MySQLだとTruncateでリセットされるはずですがPostgreSQLだとされなかったりするようですね

nalabjp commented 6 years ago
SELECT setval('dojos_id_seq', coalesce((SELECT MAX(id)+1 FROM dojos), 1), false); 

みたいなのをdojos:update_db_by_yamlタスクで実行するようにするっぽいですね🤔(要動作確認) ref: https://www.postgresql.jp/document/10/html/functions-sequence.html

yasulab commented 6 years ago

SELECT setval('dojos_id_seq', coalesce((SELECT MAX(id)+1 FROM dojos), 1), false);

あー、なるほど! ではこちらをタスク内に実装すれば解決できそうですね...!! 早速のコメントありがとうございます! 😍