2012-03-07 46 views
11

Tôi đã kết thúc với 9 lần di chuyển có hiệu quả trùng lặp. (Tôi nghĩ rằng điều này là do tôi đã cài đặt/cập nhật Gems và/hoặc kéo di chuyển trên cả máy ảo và máy sản xuất của tôi, nhưng không hoàn toàn chắc chắn ở giai đoạn này.)Đánh dấu Rails di chuyển khi di chuyển

Tôi đã chuyển một bộ 9 từ ray thư mục trên máy chủ sản xuất, nhưng bây giờ mà tôi muốn db:migrate vào sản xuất để chạy di cư khác, tôi nhận được:

$ bundle exec rake db:migrate RAILS_ENV=production 
[DEPRECATION WARNING] Nested I18n namespace lookup under "activerecord.attributes.checkout" is no longer supported 
== CreatePages: migrating ==================================================== 
-- create_table(:pages) 
rake aborted! 
An error has occurred, all later migrations canceled: 

Mysql2::Error: Table 'pages' already exists: CREATE TABLE `pages` (`id` int(11) DEFAULT NULL auto_increment PRIMARY KEY, `title` varchar(255), `body` text, `slug` varchar(255), `created_at` datetime, `updated_at` datetime) ENGINE=InnoDB 

Điều này là do sự di cư đã có hiệu quả đã được chạy.

Tôi thà tránh làm db:migrate:downdb:migrate:up cho mỗi cái - tôi nghĩ điều này có nghĩa là dữ liệu trong cơ sở dữ liệu sản xuất bị mất. (Một vài trang tĩnh trong Spree trong trường hợp này.)

Có cách nào tôi có thể nói cài đặt Rails này để quên tất cả các di chuyển xuất sắc, đánh dấu hiệu quả tất cả các di chuyển xuất sắc như đã hoàn thành?

Trả lời

6

Bạn có thể thêm dấu thời gian của các lần di chuyển vào bảng schema_migrations. Tuy nhiên tại sao bảng đó bị thiếu trong cơ sở dữ liệu hoặc thiếu các hàng cần thiết?

Có khả năng là trường hợp di chuyển cụ thể này đã đi qua một nửa và không thành công, do đó khi bạn cố chạy lại phần đầu tiên của quá trình di chuyển sẽ không hoạt động như trước đây. Đây là một hạn chế của MySQL vì nó không thể khôi phục các thay đổi di chuyển mà không thành công một phần của con đường thông qua. Mặt khác, Postgres có thể khôi phục lại các thay đổi cấu trúc cho cơ sở dữ liệu, do đó tránh được vấn đề này.

+0

Cảm ơn - điều này nghe có vẻ như nó nên làm các trick. Tôi sẽ thử. Tôi nghĩ rằng tôi đang ở trong tình huống này bởi vì 9 lần di chuyển liên quan đã được tạo ra một lần trên cả máy ảo và máy ảo của tôi (do đó di chuyển tương tự có hai lần di chuyển với dấu thời gian riêng của nó). 9 chiếc đầu tiên được chạy, nhưng sau đó tôi đã kéo thêm 9 chiếc nữa từ máy tính của mình, do đó khiếu nại về bảng đã tồn tại. Tôi vẫn đang nắm bắt được cài đặt và cập nhật Gems liên quan đến việc triển khai. –

+0

Um, tại sao bạn có các lần di chuyển trùng lặp giống nhau nhưng với các dấu thời gian khác nhau? Ý tưởng đằng sau việc di chuyển là bạn có một bộ di chuyển (tức là thay đổi cấu trúc cơ sở dữ liệu) mà mọi người sử dụng. Cơ sở dữ liệu sau đó có một bảng để theo dõi các di chuyển đã chạy, do đó chúng sẽ không chạy hai lần trên mỗi môi trường (dev/production). –

+0

Thật vậy. Tôi nghĩ rằng điều này có thể là do trước đây tôi đã cài đặt Gems (bao gồm cả di chuyển liên quan của họ) trên cả hai máy mà không nhận ra ý nghĩa. Tôi cần sắp xếp công việc. –

8

Theo mặc định rake db:migrate chạy tất cả các lần di chuyển đang chờ xử lý. Vì vậy, để có được di chuyển của bạn ngay .. vì lợi ích .. hãy chú ý đến những di cư đó và sau đó hoàn nguyên chúng trở lại bình thường. Nó sẽ đảm bảo rằng bạn là ok trong tương lai di cư.

10

Tôi giải quyết nó như thế này:

  1. Tới file di cư xung đột.

  2. Xóa nội dung và lưu nội dung.

  3. Run rake db:migrate

  4. Ctrl + Z tập tin trạng thái trước đó.

Đây là trường hợp đặc biệt vì tôi đã sao chép DB từ ứng dụng khác và tôi đã di chuyển xung đột và nội dung.

+0

vâng, đây là một công việc rất tốt xung quanh. Cảm ơn. Nhưng tôi vẫn tự hỏi nếu có một số giải pháp khác cho việc này. –

+3

Muốn thêm làm rõ: Không xóa toàn bộ nội dung. Chỉ cần xóa mọi thứ giữa khai báo lớp và kết thúc. Xóa mọi thứ sẽ dẫn đến lỗi này do sự không khớp giữa tên tệp và tên lớp: http://stackoverflow.com/questions/17776900/error-on-dbmigrate-uninitialized-constant-devisecreateusers – Dreyfuzz

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