2010-08-21 60 views
23

Có thể thay đổi trường là chuỗi thành số nguyên mà không xóa dữ liệu đã nhập không?Rails Di chuyển để chuyển đổi chuỗi thành số nguyên?

Cấu trúc db hiện tại cho các bảng trong câu hỏi là:

create_table :people do |t| 
t.string :company_id 

Đây có phải là có thể sử dụng di cư?

Tôi nghĩ có thể trong quá trình di chuyển thả trường cũ, tạo một trường mới là số nguyên - nhưng tôi lo lắng điều này sẽ xóa tất cả dữ liệu đã nhập.

Cảm ơn,

Danny

Trả lời

28

Đừng thả các cột, nó sẽ xóa dữ liệu.

Bạn tuy nhiên có thể thử

change_column :people, :company_id, :integer 

và nếu tất cả các giá trị trong company_id có thể được chuyển đổi sang integer, nó phải là tốt.

Nếu trường hợp đó không đúng (nghĩa là không phải tất cả chuỗi có thể được chuyển đổi theo mặc định), thì bạn có thể thực hiện theo hai bước: 1) tạo cột mới, sau đó tải company_id trong đó sau một số chuyển đổi. 2) thả company_id rồi đổi tên cột mới.

Bạn nên cẩn thận với cả hai phương pháp (nhiều hơn như vậy cho phương pháp thứ hai) và bạn có lẽ nên làm điều đó trước tiên trên một bản sao của cơ sở dữ liệu, nếu bạn có thể.

+0

nhờ để cải thiện các định dạng, jigfox – Zaki

+0

Tuyệt vời, cảm ơn. Tôi cho rằng tôi không phải nêu loại hiện tại trong ví dụ đầu tiên? – dannymcc

+2

Cách tiếp cận đầu tiên tạo ra lỗi cho tôi khi tôi đẩy mã vào Heroku. PG :: DatatypeMismatch: ERROR: cột "company_id" không thể tự động truyền để nhập số nguyên GỢI Ý: Chỉ định biểu thức USING để thực hiện chuyển đổi. : ALTER TABLE "cộng tác viên" ALTER COLUMN "company_id" TYPE số nguyên rake bị hủy bỏ! StandardError: Đã xảy ra lỗi, điều này và tất cả các di chuyển sau này bị hủy: PG :: DatatypeKhông khớp: ERROR: cột "company_id" không thể tự động nhập để nhập số nguyên GỢI Ý: Chỉ định biểu thức USING để thực hiện chuyển đổi. – Evolve

31

Đừng thả các cột, sử dụng này

change_column :table_name, :column_name, 'integer USING CAST(column_name AS integer)' 

Các "gợi ý" bạn nhận được từ PostgreSQL cơ bản nói với bạn rằng bạn cần phải xác nhận rằng bạn muốn điều này xảy ra, và làm thế nào dữ liệu cần được chuyển đổi. Để xác nhận thay đổi, sử dụng các khối trên trong chuyển đổi của bạn

+0

Đây phải là câu trả lời được chấp nhận – BananaNeil

8

Những câu trả lời khác là chính xác, tuy nhiên bạn có thể làm thêm một bước nữa với :using keyword:

change_column :people, :company_id, :integer, using: 'company_id::integer' 
Các vấn đề liên quan