- 更新日: 2015年9月30日
- Rails
RailsのActiveRecordでSQLite3/PostgreSQLのidをリセットする拡張
SQLite3 や PostgreSQL な Rails プロジェクトで、プライマリーキーである id の auto increment な連番(シーケンス)をリセットする ActiveRecord の拡張です。development 環境でサンプルデータをDBテーブルに流し込んだ後に、レコードを delete_all(全部削除)してもう一回サンプルデータ追加をやり直す時なんかに、id が再び 1 から振られるようにするために使う。
— 環境 —
Rails 4.2
ActiveRecord 4.2
id をリセットする ActiveRecord 拡張
Rails プロジェクトで lib 以下にファイルを設置する。
lib/active_record/add_reset_pk_sequence_to_base.rb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
module ActiveRecord class Base def self.reset_pk_sequence case ActiveRecord::Base.connection.adapter_name when 'SQLite' new_max = maximum(primary_key) || 0 update_seq_sql = "update sqlite_sequence set seq = #{new_max} where name = '#{table_name}';" ActiveRecord::Base.connection.execute(update_seq_sql) when 'PostgreSQL' ActiveRecord::Base.connection.reset_pk_sequence!(table_name) else raise "Task not implemented for this DB adapter" end end end end |
上記の ActiveRecord::Base.reset_pk_sequence のコードは、以下 stackoverflow ページを参考。
sql – Rails way to reset seed on id field – Stack Overflow
ActiveRecord 拡張が初期化で読み込まれるように設定
lib ディレクトリを autoload_paths に追加する。
config/application.rb
1 2 3 |
config.autoload_paths += %W( #{config.root}/lib ) |
続いて config/initializers に以下のファイルを設置して、作成した ActiveRecord 拡張が初期化で読み込まれるようにします。
config/initializers/lib.rb
1 |
require "active_record/add_reset_pk_sequence_to_base.rb" |
id をリセットする使い方
データを rake タスクで投入。このデータを投入する方法は、rake タスク以外何でも良いです。CSV からや SQL 実行とか。
1 2 3 |
$ bundle exec rake sample_data:populate_products |
投入したデータをいったん削除して id リセット。
1 2 3 4 5 |
$ bundle exec rails c pry> Product.delete_all pry> Product.reset_pk_sequence |
データを再び投入。
1 2 3 |
$ bundle exec rake sample_data:populate_products |
以上のようにしてやると、サンプルデータの id が再び 1 から振られてデータを再投入できます。Product.reset_pk_sequence を実行せずに再度データを流し込むと、id の番号振りが以前の連番の最後の次の数字からになります。MySQL の id リセットについては以下リンク参考。
- – 参考リンク –
- sql – Rails way to reset seed on id field – Stack Overflow
- ruby on rails 3 – How to reset auto increment field in a ActiveRecord migration? – Stack Overflow
- MySQLでauto_incrementの値を初期化する方法 – while(life)tech_onoue++;
- Ruby – railsモデルを削除して新しくmodelを追加したらIDが飛ばされることなく削除したモデルのIDが設定されてしまった。 – Qiita
- Rails の関連記事
- RailsでMySQLパーティショニングのマイグレーション
- Rails ActiveRecordでdatetime型カラムのGROUP BY集計にタイムゾーンを考慮する
- RailsプラグインGemの作成方法、RSpecテストまで含めたrails pluginの作り方
- RailsでAMPに対応するgemをリリースしました
- Railsでrequest.urlとrequest.original_urlの違い
- Railsでwheneverによるcronバッチ処理
- Google AnalyticsのRails Turbolinks対応
- Railsアプリにソーシャル・シェアボタンを簡単設置
- Rails監視ツール用にErrbitをHerokuで運用
- Facebook APIバージョンのアップグレード手順(Rails OmniAuth)
Leave Your Message!