Rails种子:如何截断DB表?

时间:2013-02-26 21:34:21

标签: sql ruby-on-rails postgresql

在将测试数据播种到数据库表之前,我需要截断表(我需要重置主键),我试图这样做:

ActiveRecord::Base.connection.execute("TRUNCATE users")

但是当我从DB打印出数据时,我仍然没有看到从1开始计算主键。

我做错了什么?

修改

另外,我尝试在终端中手动运行PostgreSQL数据库

truncate users

但主要计数仍然不是从1开始。

SOLUTION:

在Postgres中,运行:

ALTER SEQUENCE users_id_seq RESTART WITH 1;

4 个答案:

答案 0 :(得分:6)

MySQL 中,TRUNCATE table;删除所有行重置自动增量计数器。

PostgreSQL 中,它不会自动执行此操作。您可以使用TRUNCATE TABLE table RESTART IDENTITY;

仅供记录:在 SQLite 中,没有TRUNCATE语句,相反,它是

DELETE FROM table;
DELETE FROM sqlite_sequence WHERE name='table';

答案 1 :(得分:4)

如果您的数据库是postgres,您可以执行以下操作来截断模型的数据库表:

[
  MyModel1,
  MyModel2,
  MyModel3
].each do |m|
  ActiveRecord::Base.connection.execute("TRUNCATE TABLE #{m.table_name} RESTART IDENTITY;")
end

答案 2 :(得分:4)

现在为时已晚,我正在回答这个问题,但我希望这会对其他人有所帮助。

您必须安装(或者您可以将gem 'database_cleaner'添加到您的Gemfile中)一个名为Database Cleaner的GEM,这有助于清理您的数据库而不会影响您的数据库架构._

每次执行rake db:seed时都要清理数据库,然后粘贴

DatabaseCleaner.clean_with(:truncation)

位于种子文件的顶部。 它将清除您的数据库并再次从1开始计数。


免责声明:此更新后的答案已经过测试,并且在我的系统中完美运行

答案 3 :(得分:0)

在csv_upload.rb中的Rails中,我使用过它。

ActiveRecord :: Base.connection.execute('TRUNCATE model_name RESTART IDENTITY')