簡體   English   中英

為什么rake拋出這個Rails遷移錯誤?

[英]Why is rake throwing this Rails migration error?

我有兩台機器......一台開發機器和一台生產機器。 當我第一次將rails應用程序帶到生產服務器上時,我沒有遇到任何問題。 我只是通過運行rake db:schema導入schema.rb:load RAILS_ENV = production。 一切都好。

那么,然后在我的開發機器上,我進行了一些更改和另一次遷移,然后將新應用程序復制到生產機器上。 然后,我嘗試通過運行rake db:migrate RAILS_ENV = production來更新數據庫。 我收到以下錯誤:“數據庫中已經有一個名為'schema_migrations'的對象。”

我在想,你也不開玩笑......你創造了它! 我在耙子上跑了一下,似乎耙子認為這是它第一次跑。 但是,通過分析我的開發機器和生產機器上的'schema_migrations'表,您可以看到一個遷移的差異,即我想要遷移的遷移。

我也試圖明確定義版本號,但這也不起作用。

關於如何讓我的生產服務器更新的任何想法?

更新:

首先我要說的是,我不能只是“丟棄”數據庫。 它是一個生產服務器,其中已有超過10萬條記錄。 如果將來發生類似問題會怎樣? 是的,我每次發生數據庫問題時都會丟棄表格? 這次可能會有效,但對於每個數據庫問題,它似乎都不是一個實用的長期解決方案。 我懷疑我現在遇到的問題對我來說是獨一無二的。

  1. 聽起來像'schema_info'表和'schema_migrations'表是相同的。 在我的設置中,我只有'schema_migrations'。 如前所述,生產服務器上的'schema_migrations'表與開發機器之間的差異只是一條記錄。 也就是說,包含我要遷移的更改的版本號的記錄。

  2. 從我讀過的書“Simply Rails 2”中,它指出當第一次移動到生產服務器時,不應該運行rake db:migrate,而應該運行rake:db:schema:load。

  3. 如果重要,我正在使用Rails 2.1版。

這是一個猜測,我承認:我認為,因為您首先在生產環境中運行db:schema:load而不是db:migrate,所以您獲得了db的結構,但沒有遷移的數據填充到schema_info表中。 所以現在,當你在生產環境中運行遷移時,schema_info中沒有數據,這就是為什么遷移認為它尚未運行的原因(因為它還沒有)。

那說......你說你已經查看了“schema_migrations”表,並且從開發到生產有一個版本的差異...我沒有聽說過那個表,雖然我已經有幾個月了在我的rails版本后面。 也許您可以嘗試使用單個“版本”列在生產環境中創建“schema_info”表,並添加一行,其中包含您認為生產環境所在的版本。

關於你的更新:

  1. 我不明白你的生產schema_migrations和dev版本之間有什么區別。 兩個表中是否有記錄(應該只有1列,“版本”,右)或者在開發DB中是否有一條記錄而在生產中是否有零記錄? 如果生產表中有零記錄,則執行以下操作:

    ActiveRecord::Base.connection.execute("INSERT schema_migrations (version) VALUES(#{my version number that production is supposedly on})")

  2. 或者,您可以嘗試完全刪除schema_migrations表:

    ActiveRecord::Base.connection.execute("DROP TABLE schema_migrations")

    然后,重新運行rake db:migrate RAILS_ENV=production 這將從版本1開始運行遷移,這可能不是你想要的。

  3. 或者,您也可以在生產環境中啟動IRB會話,對要加載的遷移文件執行“require”或“load”(我永遠不會記住哪個,或者是否重要),然后調用MyMigrationClass.up 您需要在此之后手動設置schema_migrations表中的版本號,因為您仍然會遇到問題,但作為快速修復類型的hack,這將起作用。

如果你得到“數據庫中已有一個名為'schema_migrations'的對象。” 錯誤消息然后我懷疑您使用MS SQLServer作為您的數據庫? (因為這看起來像MS SQL Server錯誤信息)

如果是,那么您使用的是哪個ActiveRecord數據庫適配器? (你的database.yml文件是什么,你為安裝MS SQL Server數據庫安裝了什么gems?)

目前似乎Rails在生產模式中找不到schema_migrations表,因此嘗試創建它,並且此創建失敗並顯示數據庫錯誤消息。 原因可能是schema_migrations表名中的大寫/小寫字符 - 據我所知,MS SQL Server標識符區分大小寫。

根據在生產中使用的系統上,我看到情況其中以下工作:

rake db:migrate RAILS_ENV=production

但是這個工作的地方:

RAILS_ENV=production rake db:migrate

古怪,我知道,但是值得一試,看看它是否有所作為。

我知道這篇文章是在不久前發生的,但我偶然發現它並沒有得到真正的回答。 隨着它出現在谷歌,這里去。

當您執行rake db:schema:dump時(或者當構建腳本為您完成此操作時),它會將遷移表的定義放入schema.rb中。 在腳本結束時,進程將嘗試再次創建表,但它顯然已存在。 在運行rake:schema:load之前,只需從schema.rb中刪除遷移表,就不會出現錯誤消息。

您需要在遷移表中設置版本號以便隨后運行遷移。 因此,了解schema.rb的相關版本或刪除所有舊遷移(它們在SCM中的安全性是否合適?)非常重要。

我會刪除數據庫,再次添加它並運行rake rb:migrate。 Brad是正確的,當您運行架構加載時,它沒有在schema_migrations表中放置任何記錄。

當然,如果有生產服務器上不能丟失的數據,這就更復雜了。 您可以獲得rake備份任務(不確定它是否是核心的一部分)然后在生產數據庫上運行rake db:backup:write,然后在生產時獲得最新的遷移后,運行rake db:備份:閱讀。

schema_info來自舊版本的Rails。 schema_migrations是塊上的新手。 您應該能夠刪除schema_info表,因為它將不再使用。 您可能希望搜索與此名稱更改相關的任何問題。

rake db:schema:load將從schema.rb加載數據庫結構。 此文件是數據庫結構的當前表示形式。 當您擁有需要創建所有表和索引的空模式(數據庫)時,可以使用它。 它可以節省您運行所有遷移的麻煩。 如果您有一個包含數據的現有生產數據庫,則不希望運行它。 正如其他人所說的那樣糟糕!

rake db:migrate RAILS_ENV=production

使用db:schema:load任務只是為了第一次創建,應該遷移增量更改。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM