2012-03-07 177 views
11

我已經結束了9遷移有效複製。 (我認爲這是因爲我安裝/更新了Gems和/或在我的開發和生產機器上進行了遷移,但在這個階段我並不完全確定。)標記Rails遷移的遷移

我搬出了一組重複的9在生產服務器上的軌道目錄,但現在,我想db:migrate生產才能運行另一遷移,我越來越:

$ 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 

這是因爲遷移,有效地已經運行。

我寧願避免做db:migrate:downdb:migrate:up爲每一個 - 我認爲這將意味着在生產數據庫中的數據丟失。 (一對夫婦在這種情況下,在施普雷靜態頁面。)

有沒有一種方法,我可以告訴這個安裝的Rails忘記所有優秀的遷移,有效地標記所有未遷移的呢?

回答

6

您可以在遷移的時間戳添加到schema_migrations表。但是,爲什麼數據庫中缺少該表或缺少所需的行?

很可能是這種特定的遷移已經完成並失敗了,因此當您嘗試再次運行時,遷移的第一部分將無法像以前完成的那樣工作。這是MySQL的限制,因爲它無法回滾遷移失敗的遷移。另一方面,Postgres可以回滾數據庫的結構變化,從而避免這個問題。

+0

謝謝 - 這聽起來像它應該做的伎倆。我會試一試。我認爲我處在這種情況下,因爲涉及的9次遷移在我的dev和prod機器上都創建了一次(因此,實際上相同的遷移有兩次遷移,每次遷移都有自己的時間戳)。前9名運行,但我從我的開發機器拉了另外9個,因此對錶格的投訴已經存在。我仍然在處理安裝和更新Gems的部署方面。 – 2012-03-07 17:09:48

+0

嗯,爲什麼你有重複的遷移是相同的,但具有不同的時間戳?遷移背後的想法是,你有一套每個人都使用的遷移(即對數據庫結構的更改)。然後數據庫有一個表來跟蹤已經運行的遷移,因此它們不會在每個環境(dev/production)上運行兩次。 – 2012-03-08 14:51:37

+0

確實。我認爲這可能是因爲我之前在兩臺機器上都安裝了Gems(包括它們相關的遷移),卻沒有意識到這一點。我需要排除工作流程。 – 2012-03-08 18:08:54

8

默認情況下rake db:migrate運行所有未決的遷移。所以,爲了讓你的遷移正確..爲了這些遷移,然後將這些遷移恢復正常。這將確保您在將來的遷移中沒問題。

10

我解決了它這樣的:

  1. 前往衝突的遷移文件。

  2. 刪除內容並保存。

  3. 運行rake db:migrate

  4. 按Ctrl + Z文件到以前的狀態。

這是一個特殊情況,因爲我從另一個應用程序複製了數據庫,而且我有衝突的遷移和其他東西。

+0

是的,這是一個很好的解決方法。謝謝。但我仍然想知道是否有其他解決方案。 – 2014-08-22 05:15:50

+3

想補充說明:不要抹掉整個內容。只要刪除類聲明和結束之間的所有內容即可。由於文件名和類名稱不匹配,刪除所有內容將導致此錯誤:http://stackoverflow.com/questions/17776900/error-on-dbmigrate-uninitialized-constant-devisecreateusers – Dreyfuzz 2015-07-09 20:12:19