在将测试数据播种到数据库表之前,我需要截断表(我需要重置主键),我试图这样做:
ActiveRecord::Base.connection.execute("TRUNCATE users")
但是当我从DB打印出数据时,我仍然没有看到从1开始计算主键。
我做错了什么?
修改
另外,我尝试在终端中手动运行PostgreSQL数据库
truncate users
但主要计数仍然不是从1开始。
SOLUTION:
在Postgres中,运行:
ALTER SEQUENCE users_id_seq RESTART WITH 1;
答案 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')