coderdojo.jp
coderdojo.jp copied to clipboard
セットアップ時に dojos:update_db_by_yaml を使うと id の追加で失敗する
@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 のイテレータの初期値がおかしいのかなぁ)
@yasulab
ID指定してレコードを作るとシーケンスが上がらないみたいですね。
既に作成済みのDBに対して$ dojos:update_db_by_yaml
を実行しているという状況でしょうか?
@nalabjp
既に作成済みのDBに対して$ dojos:update_db_by_yamlを実行しているという状況でしょうか?
ですね! 本番環境のDBを $ heroku pg:pull DATABASE_URL coderdojo_jp_development --app coderdojo-japan
で取得してから実行しています! 📥 ☁️
MySQLだとTruncateでリセットされるはずですがPostgreSQLだとされなかったりするようですね
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
SELECT setval('dojos_id_seq', coalesce((SELECT MAX(id)+1 FROM dojos), 1), false);
あー、なるほど! ではこちらをタスク内に実装すれば解決できそうですね...!! 早速のコメントありがとうございます! 😍