Rails如何重置所有Postgres序列?

23

在Rails 3控制台中,以下操作可用于重置Postgres序列:

ActiveRecord::Base.connection.reset_pk_sequence!('menucontrols')
ActiveRecord::Base.connection.reset_pk_sequence!('statuscodes')
ActiveRecord::Base.connection.reset_pk_sequence!('wostatuses')
ActiveRecord::Base.connection.reset_pk_sequence!('taskstatuses')
ActiveRecord::Base.connection.reset_pk_sequence!('priorities')
ActiveRecord::Base.connection.reset_pk_sequence!('actcodes')

有没有一条命令可以将它们全部重置,而不是需要逐个重置?

感谢帮助!

2个回答

59

这更简单了。

ActiveRecord::Base.connection.tables.each do |t|
  ActiveRecord::Base.connection.reset_pk_sequence!(t)
end

15

我从这篇文章中找到了一种方法: Reset PostgreSQL

我将以下代码放入seed.rb文件中,并运行rake db:seed

ActiveRecord::Base.connection.tables.each do |table|
  result = ActiveRecord::Base.connection.execute("SELECT id FROM #{table} ORDER BY id DESC LIMIT 1") rescue ( puts "Warning: not procesing table #{table}. Id is missing?" ; next )
  ai_val = result.any? ? result.first['id'].to_i + 1 : 1
  puts "Resetting auto increment ID for #{table} to #{ai_val}"
  ActiveRecord::Base.connection.execute("ALTER SEQUENCE #{table}_id_seq RESTART WITH #{ai_val}")
end

1
尝试使用reset_pk_sequence!方法,但在使用Heroku Postgres与我的dev PG(应该可以工作的表)时遇到了问题。也许是由于较新版本的PG与旧版本之间的差异。不管怎样,这种方法完成了工作甚至没有任何错误。非常好。 - Nuclearman
这是今天的“你救了我的命”!我们的DBA迁移了数据表,但忘记重建序列。 - Hegwin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接