2017-06-14 56 views
8

我寫了下面的遷移:遷移創建表提出Mysql2 ::錯誤:表不存在

class CreateTableSomeTable < ActiveRecord::Migration[5.1] 
    def change 
    create_table :some_tables do |t| 
     t.references :user, foreign_key: true 
     t.references :author, references: :user, foreign_key: true 
     t.text :summary 
    end 
    end 
end 

這是創建數據庫表中的基本遷移。但是:當我運行rails db:migrate一個非常奇怪的錯誤信息中止遷移:

Mysql2::Error: Table 'my_database.some_tables' doesn't exist: SHOW FULL FIELDS FROM 'some_tables'

這是因爲如果錯誤是說,因爲該表確實存在不能創建表,這沒有任何意義。

事情我已經看過並嘗試:

  • 回顧這似乎罰款的database.yml。什麼都沒有改變,我最近運行其他遷移就好了(雖然創建數據庫表沒有遷移)
  • bundle,以確保所有的寶石都安裝
  • 刪除schema.rb文件,重新創建與數據從數據庫的另一個副本,我運行rake db:schema:dump重新創建schema.rb文件。我試圖再次運行遷移,仍然有相同的錯誤。

我使用rails 5.1.1以及mysql2 0.4.6

我如何能得到任何提示,在遷移到運行?

+0

它看起來像是你的鴨子在一排,所以這可能是一個多餘的問題,但是:你是否證實這是特定的遷移導致的問題,例如,通過將調試代碼放入遷移中,或者使用環境變量導致只運行一個遷移?在運行遷移時,日誌文件中顯示的內容與此表相關? –

+1

嘗試運行'rake db:migrate:status'來查看已經應用到數據庫的遷移。也許你發現你連接到不同的模式,或者你發現失敗的遷移不是你認爲導致失敗的遷移。 – Bustikiller

回答

2

我想出了一個解決方法,但它仍然是我非常困惑。

日誌文件中的錯誤消息並不完全指向問題。出於某種原因,它可能是rails 5.1.1或它可能是mysql2 0.4.6,但它不喜歡在create_table塊內使用references出於某種原因。很奇怪,因爲它在過去對我有效。

所以我改變了這個遷移:

class CreateTableSomeTable < ActiveRecord::Migration[5.1] 
    def change 
    create_table :some_tables do |t| 
     t.references :user, foreign_key: true 
     t.references :author, references: :user, foreign_key: true 
     t.text :summary 
    end 
    end 
end 

要這樣:

class CreateTableSomeTable < ActiveRecord::Migration[5.1] 
    def change 
    create_table :some_tables do |t| 
     t.integer :user_id 
     t.integer :author_id 
     t.text :summary 
    end 
    end 
end 

和它的工作。

這是非常奇怪,因爲references作品只是罰款sqlite3(我測試了這通過生成一個虛擬應用程序,跑了一列references支架命令,跑rails db:migrate和它的所有工作)。

+1

有趣。可能是適配器中的一個錯誤。無論如何,謝謝你記錄的決議。這可能會幫助其他人遇到同樣的問題。 –

+0

't.references:author,references :: user,foreign_key:true'這可能也是你的問題,因爲你將'references::user'作爲'option'傳遞給列定義。這可能是一個導致您提到的消息導致錯誤冒泡的情況。 (雖然通過'active_record'來查看我看不到一個原因,爲什麼這不會被忽略作爲一個選項) – engineersmnky

+0

@engineersmnky我確實考慮過這一點。我測試完全刪除那個'reference'行,只剩下't.references:user,foreign_key:true'這個簡單的參考行。不幸的是它仍然錯誤。 – Neil

12

當我嘗試創建一個新模型時,有一個類似的錯誤,該模型引用了在遷移到Rails 5.1之前創建的現有模型。

雖然錯誤消息不是很清楚,但在我的情況下,原來問題是舊模型的主鍵和新模型的外鍵之間的數據類型不匹配(MySQL不允許)。這是因爲從Rails 5.1開始,所有主鍵和外鍵的默認數據類型都是bigint,但對於舊模式,主鍵類型仍然是整數。

我通過將當前模型的所有主鍵和外鍵轉換爲bigint來解決此問題,因此我可以使用Rails新的默認設置並忘記它。

解決方法還可以爲新外鍵指定整數類型,以便它們與舊模型的主鍵類型相匹配。像下面這樣:

class CreateUserImages < ActiveRecord::Migration[5.1] 
    def change 
    create_table :user_images do |t| 
     t.references :user, type: :integer, foreign_key: true 
     t.string :url 
    end 
    end 
end 
0

這使我瘋了,我想我看到了一個不同於其他人建議的原因。就我而言,它發生是因爲我的遷移文件名與其中的遷移類不完全匹配。例如,我有一個名爲20171205232654_bonus.rb的遷移文件,但在課堂內部被宣佈爲class CreateBonus < ActiveRecord::Migration[5.1]。一旦我將文件名更改爲20171205232654_create_bonus.rb一切正常。

這可能與我一直在創建遷移,而不是完整的腳手架,也許我做錯了事實有關。我真的不知道如何解決這個錯配。

1

ActiveRecord遷移5.1的一個大問題是,現在id應該是BIGINT而不是INT,所以當你添加一個引用在rails 5.1之前創建的另一個表的列時,它希望列類型是BIGINT,而不是隻是一個INT,因此是錯誤。 最好的解決方案是修改您的遷移並將列的類型更改爲int。

class CreateTableSomeTable < ActiveRecord::Migration[5.1] 
def change 
    create_table :some_tables do |t| 
    t.references :user, foreign_key: true, type: :int 
    t.references :author, references: :user, foreign_key: true 
    t.text :summary 
    end 
end 

應該工作。