使用rails控制台截断表

Cap*_*arl 39 truncate ruby-on-rails rails-console ruby-on-rails-3

我有这个测试数据库,到现在为止,它充满了垃圾.现在我在rails控制台中完成了一些Table.destroy_all命令,这些命令删除了很棒的所有记录和依赖项.然而; 我想截断所有内容,以便ID等等再次从1开始.在Rails 3中有什么办法吗?

Rav*_*aju 132

只有在需要重新创建整个数据库时,才能使用已接受的答案.
要删除单个表(使用回调)并从1开始获取ID:

Model.destroy_all # Only necessary if you want to trigger callbacks.
ActiveRecord::Base.connection.execute("TRUNCATE #{table_name} RESTART IDENTITY")
Run Code Online (Sandbox Code Playgroud)

如果您使用的是Sqlite,则它不支持截断,请执行以下操作:

Model.destroy_all # Only necessary if you want to trigger callbacks.
ActiveRecord::Base.connection.execute("Delete from #{table_name}")
ActiveRecord::Base.connection.execute("DELETE FROM SQLITE_SEQUENCE WHERE name='#{table_name}'")
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你的投票.整个数据库要求从问题中不清楚!仅供参考,rake db:drop将删除数据库.如果要求只是截断所有表,你可以运行ActiveRecord :: Base.connection.tables.collect {| table_name | ActiveRecord :: Base.connection.execute("TRUNCATE#{table_name}")}.虽然它可能不会处理回调,但我认为没有必要,因为我们正在截断所有表. (4认同)
  • 在Postgres中,第二个命令实际上没有重置ID列的自动增量值.为此,您需要"TRUNCATE table_name RESTART IDENTITY").请参见http://stackoverflow.com/a/7610991/271454 (4认同)
  • 只是为了澄清:对于MySQL/MariaDB:`ActiveRecord :: Base.connection.execute("TRUNCATE#{table_name}")`对于PostgreSQL:`ActiveRecord :: Base.connection.execute("TRUNCATE#{table_name} RESTART IDENTITY" )` (3认同)
  • 你的答案是正确的,当一个表应该被截断(我感谢你)我选择Yam Marcovic答案作为接受的答案,因为我确实要求"一切"被截断. (2认同)

小智 12

这对我有用 - ActiveRecord::Base.connection.execute("TRUNCATE table_name")

  • 然而最好和最简单的答案 (2认同)

Car*_*nés 10

Model.connection.truncate(Model.table_name)
Run Code Online (Sandbox Code Playgroud)


小智 8

Rails 6.0+ 添加新方法:truncate_tables

ActiveRecord::Base.connection.truncate_tables([:table1_name, :table2_name])
Run Code Online (Sandbox Code Playgroud)

/sf/answers/4803277951/