2012-11-30 30 views
6

Tôi gặp lỗi khi cố gắng di chuyển db của mình. Tôi không hoàn toàn nhớ làm thế nào tôi có ở đây, nhưng tôi tin rằng tôi:Rails Lỗi di chuyển DB: mối quan hệ đã tồn tại

  1. tạo chi nhánh mới, scaffolded 'yêu', db: di cư, chuyển trở lại để làm chủ, và chi nhánh sáp nhập
  2. tạo một chi nhánh khác, đã làm một số thứ, db: di chuyển và mọi thứ đều hoạt động tốt.
  3. được lấy từ cơ sở dữ liệu postgres của cô ấy để tôi có thể kiểm tra xem mọi thứ có hoạt động với dữ liệu thực tế hay không. sau đó cố gắng db di cư, nhưng đã cho tôi lỗi này:

    rake db:migrate 
    == CreateRequests: migrating ================================================= 
    -- create_table(:requests) 
    NOTICE: CREATE TABLE will create implicit sequence "requests_id_seq1" for serial column "requests.id" 
    rake aborted! 
    An error has occurred, this and all later migrations canceled: 
    
    PG::Error: ERROR: relation "requests" already exists 
    : CREATE TABLE "requests" ("id" serial primary key, "title" character varying(255), "content" text, "category" character varying(255), "status" character varying(255), "requested_track_id" integer, "created_at" timestamp, "updated_at" timestamp) 
    

Bất kỳ ý tưởng?

+1

Thông báo về việc tạo một chuỗi ẩn không phải là lỗi, chỉ là một thông báo (một thông báo thông tin, điều này là bình thường đối với bất kỳ bảng nào sử dụng cột tăng tự động mà bản ghi hoạt động sẽ làm theo mặc định cho cột 'id'.Lỗi là bảng 'requests' đã tồn tại. – qqx

+0

vì vậy tôi sẽ làm gì trong trường hợp tôi nhận được tin nhắn đó? Tôi đã giải quyết nó bằng cách tạo các di chuyển để thả bảng và sau đó tạo lại di chuyển để tạo cùng một bảng. Có cách nào tốt hơn? – kibaekr

+1

Lược đồ cơ sở dữ liệu của bạn sẽ là kết quả thực của tất cả các nhánh, giả sử cùng một môi trường. Cho đến khi bạn hợp nhất các chi nhánh, mã của bạn sẽ không cần thiết hiển thị chuỗi di chuyển thực sự đã xảy ra trên db cơ sở. Và, khi bạn chạy quá trình di chuyển, kiểm tra di chuyển trước sẽ chỉ được thực hiện đối với các lần di chuyển hiện tại, điều này sẽ cho biết xung đột tiềm năng. Tôi muốn đề nghị giữ tất cả các di chuyển trong một nhánh. –

Trả lời

4

Tôi không chắc chắn chính xác những gì kéo chiến lược bạn sử dụng, nhưng nếu chúng ta thực hiện hai giả định hợp lý về chiến lược kéo của bạn:

  1. nó không thả các cơ sở dữ liệu nhưng chỉ ghi đè bảng, vì điều này đòi hỏi ít quyền.
  2. nó đang hoạt động trong một loại 'chế độ lưu trữ', có nghĩa là nó không thả bảng trên đích đến chỉ vì chúng không tồn tại trên nguồn. Hãy nghĩ rsync; bạn phải chỉ định --delete để có được những gì có thể là hành vi mong đợi của bạn với tiện ích đó.

Nếu các bước của bạn đúng, thì điều gì đã xảy ra là bạn ghi đè bảng schema_migrations, vì vậy Rails cho rằng bạn chưa thêm bảng, nhưng cũng không kéo bảng của bạn xuống vì số 2 ở trên.

Không tạo di chuyển khác !!! Điều này sẽ không thành công trên máy tính của mọi người trừ máy tính của bạn, nhưng sẽ chỉ chạy trên máy của bạn một lần.

Thay vào đó, hãy chạy rails dbconsole và thực hiện một cái gì đó như DROP TABLE 'requests' (Tôi quên cú pháp postgres, có thể không chính xác như vậy). Sau đó, bạn có thể chạy di chuyển của mình.

2

Có một cách khác để tránh làm rơi bảng có dữ liệu trong đó.

Việc tôi làm trong những trường hợp đó là kiểm tra xem di chuyển nào không thành công.

Giả sử bạn có tệp db/migrate/20130908214222_create_requests.rb và vì một số lý do, ActiveRecord không thành công trong quá khứ khi lưu trữ di chuyển này trong "hệ thống theo dõi" của nó.

Để chắc chắn rằng đây là trường hợp, chỉ cần tìm, trong bảng schema_migrations, một hàng chứa một số mặt hàng như ví dụ sau: 20130908214222

Nếu hàng đó không tồn tại, bạn chỉ cần chèn một cái mới :

INSERT INTO schema_migrations(
    version 
) VALUES (
    20130908214222 
); 

lần sau bạn chạy rake db:migrate, ActiveRecord sẽ bỏ qua bước này, và sẽ tiếp tục di chuyển đến kết thúc mà không có biến chứng.

Các vấn đề liên quan