2013-02-26 2 views
5

Trước khi gieo hạt dữ liệu thử nghiệm vào bảng DB tôi cần phải cắt ngắn bảng (Tôi cần phải thiết lập lại khóa chính), tôi đang cố gắng để làm điều đó theo cách này:Rails seed: Làm thế nào để cắt bớt bảng DB?

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

nhưng khi tôi in ra dữ liệu từ DB, tôi vẫn không thấy đếm khóa chính từ 1.

Tôi đang làm gì sai?

EDIT:

Ngoài ra, tôi đã thử bằng tay chạy tại nhà ga đến cơ sở dữ liệu PostgreSQL

truncate users 

Nhưng đếm tiểu học vẫn không bắt đầu từ 1.

SOLUTION :

Trong Postgres, chạy:

ALTER SEQUENCE users_id_seq RESTART WITH 1; 
+0

Đây không thực sự là vấn đề đường ray. Bạn sẽ cần phải thực thi đúng SQL cho cơ sở dữ liệu của mình để thay đổi giá trị auto_increment. Bạn có thể thả bảng và tạo lại nó, nhưng đó có thể là quá mức cần thiết. Xem câu hỏi này trên ngăn xếp tràn để biết thêm thông tin: http://stackoverflow.com/questions/6241684/reset-primary-key-auto-increment –

+0

Cảm ơn Scott, nếu bạn không phiền, tôi sẽ đăng một giải pháp đã giúp tôi . – user984621

Trả lời

6

Trong MySQL, TRUNCATE table; xóa tất cả các hàng reset bộ đếm tự động tăng.

Trong PostgreSQL nó không tự động thực hiện việc này. Bạn có thể sử dụng TRUNCATE TABLE table RESTART IDENTITY;.

Chỉ cần cho các hồ sơ: Trong SQLite, không có tuyên bố TRUNCATE, thay vào đó, nó

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

Từ bên trong Rails trong một csv_upload.rb tôi đã sử dụng và nó làm việc.

ActiveRecord :: Base.connection.execute ('TRUNCATE model_name RESTART SẮC')

3

Trong trường hợp db của bạn là postgres, bạn có thể làm một cái gì đó như thế này để cắt các bảng db của mô hình của bạn:

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

Thật đẹp. – skwidbreth

3

Điều này đã quá muộn Tôi trả lời câu hỏi này nhưng tôi hy vọng điều này sẽ giúp người khác.

Bạn đã cài đặt (OR bạn có thể thêm gem 'database_cleaner' để Gemfile của bạn) một GEM gọi Database Cleaner giúp để làm sạch cơ sở dữ liệu của bạn mà không ảnh hưởng đến cơ sở dữ liệu của bạn schema._

Để làm sạch cơ sở dữ liệu của bạn mỗi khi bất cứ khi nào bạn làm rake db:seed sau đó dán

DatabaseCleaner.clean_with(:truncation) 

ở đầu tệp hạt giống của bạn. Nó sẽ xóa cơ sở dữ liệu của bạn và bắt đầu đếm từ 1 một lần nữa.


Disclaimer: câu trả lời cập nhật này được thử nghiệm, và làm việc một cách hoàn hảo trong hệ thống của tôi.