2012-11-20 27 views
16

Trong bảng general_exams của tôi, tôi có cột có tên semester, loại là string. Bây giờ tôi muốn đổi tên thành semester_id, nhập là integer. Tôi đã đọc về di chuyển và có các biến đổi có sẵn:Cách đổi tên cột và thay đổi loại của nó bằng cách di chuyển cùng một lúc

  • rename_column (table_name, column_name, new_column_name): Đổi tên cột nhưng giữ loại và nội dung.
  • change_column (tên_bảng, column_name, loại, tùy chọn): Thay đổi cột thành một loại khác bằng cách sử dụng cùng các tham số như add_column.

Vì vậy, tôi có thể tạo tập tin chuyển đổi của tôi như thế này:

class RenameSemesterFromGeneralExams < ActiveRecord::Migration 

    def change 
    rename_column :general_exams, :semester, :semester_id 
    change_column :general_exams, :semester_id, :integer 
    end 
end 

Tuy nhiên, khi tôi chạy rake db:migrate, nó có lỗi:

== RenameSemesterFromGeneralExams: migrating ================================= 
-- rename_column(:general_exams, :semester, :semester_id) 
    -> 0.0572s 
-- change_column(:general_exams, :semester_id, :integer) 
rake aborted! 
An error has occurred, this and all later migrations canceled: 

PG::Error: ERROR: column "semester_id" cannot be cast to type integer 
: ALTER TABLE "general_exams" ALTER COLUMN "semester_id" TYPE integer 

Trong bảng GeneralExam của tôi, tôi đã phá hủy toàn bộ dữ liệu . Vì vậy, bất cứ ai cũng có thể cho tôi biết làm thế nào tôi có thể làm điều đó? Hoặc tôi phải tạo hai tệp di chuyển?

+2

Câu hỏi này thực sự là thực sự hữu ích bởi vì, bên cạnh những lỗi trong nó, nó xác định một cách chính xác làm thế nào để thay đổi một tên cột và nhập vào câu hỏi đó! – EdgeCaseBerg

Trả lời

9

Sự cố của bạn có thể là semester chứa dữ liệu không thể chuyển đổi thành integers. Đó là lý do tại sao bạn gặp phải lỗi truyền.

Tôi nghi ngờ bạn cần phải làm nhiều việc hơn để thực hiện công việc này vì điều duy nhất mà bạn nghĩ đến là xóa cột và tạo cột mới với giá trị chính xác.

Nhưng bạn có thể chỉ cần remove_column và sau đó add_column trong một lần di chuyển. Điều đó sẽ hoạt động hoàn hảo.

Tôi cũng đề nghị bạn chỉ add_column trước, sau đó thực hiện quá trình ánh xạ nơi bạn ánh xạ giá trị semester cũ lên semester_id mới và sau đó thả cột.

Hãy nhớ rằng bạn có thể thực hiện thao tác ActiveRecord bên trong quá trình di chuyển của mình. Vì vậy, bạn có thể đặt mã đó trong đó.

+0

Tôi đã hủy tất cả dữ liệu trong bảng GeneralExam. Nếu tôi không tìm được cách nào để làm cùng một lúc, tôi sẽ tạo 2 di chuyển, nhưng tôi nghĩ nó không thuận tiện. Cảm ơn về câu trả lời. – Thanh

+0

Cập nhật câu trả lời của tôi với một số chi tiết khác – Tigraine

+0

Tôi không cần dữ liệu cũ của cột học kỳ. Vì vậy, remove_column hoặc add_column đầu tiên có thể không phải là một vấn đề. Tôi sẽ làm theo cách này, cảm ơn. – Thanh

0

Lỗi này là do có dữ liệu hiện có trong bảng (hoặc giá trị mặc định, có lẽ ..) mà PG không biết cách chuyển đổi từ chuỗi thành số nguyên. Hoặc là loại bỏ dữ liệu hoặc cho PG biết cách bạn muốn chuyển đổi nó, sử dụng PG cụ thể SQL (Tôi nghĩ bạn sẽ muốn USING) và execute lệnh di chuyển. Xem hướng dẫn Rails về di chuyển.

+0

Tôi đã hủy tất cả dữ liệu trong bảng đó. Bạn có nghĩa là tôi nên sử dụng lên và xuống? – Thanh

+0

Nếu bạn đã hủy tất cả dữ liệu, thì điều duy nhất tôi có thể nghĩ là cột có thể có giá trị mặc định (không thể chuyển đổi thành số nguyên). Tôi không phải là một PG mong đợi. –

+0

Tôi không đặt giá trị mặc định cho cột đó, tôi cũng không hiểu tại sao tôi không thể thay đổi loại khi cột không có giá trị. Vì vậy, tôi phải chọn cách khác. Lol, tôi cũng không phải là chuyên gia, tôi vẫn chỉ là sinh viên :)) – Thanh

13

này hoạt động như của Rails 4

def change 
    rename_column :general_exams, :semester, :semester_id 
    change_column :general_exams, :semester_id, :integer 
end 
0

Tôi hy vọng điều này giúp đỡ

 
class ModifyColumnTables 
    def change 
    remove_column :posts, :old_column 
    add_column :posts, :new_column, :type_of_column 
    end 
end 
Các vấn đề liên quan