2015-08-03 55 views
0

我使用Rails 4,SQLite版本3.8.2,我想添加新列到我的數據庫。 創建新的遷移:Add_column遷移列順序

rails g migration AddFooToStudents foo:string 

,所以我得到那麼:

class AddFooToStudents < ActiveRecord::Migration 
    def change 
    add_column :students, :foo, :string, after: :name 
    end 
end 

然後我跑遷移:

rake db:migrate 

== 20150803095305 AddFooToStudents: migrating 
================================= 
-- add_column(:students, :foo, :string, {:after=>:name}) 
-> 0.0009s 
== 20150803095305 AddFooToStudents: migrated (0.0011s) 
======================== 

Everythink看來不錯,在數據庫已添加FOO列但不是名稱列後,它已被添加在表末尾

ActiveRecord::Schema.define(version: 20150803095305) do 
create_table "students", force: :cascade do |t| 
    t.string "name" 
    t.string "lastname" 
    t.integer "age" 
    t.datetime "created_at",      null: false 
    t.datetime "updated_at",      null: false 
    t.string "second_name", default: "Untitled" 
    t.string "foo" 
end 
end 

我完全不知道我做錯了

+0

你沒有做錯什麼。這是運行遷移的正常工作行爲。已將「foo」列添加到表中。如果你絕對必須重新排列列,[這裏](http://stackoverflow.com/questions/18899011/rails-4-migration-how-to-reorder-columns)是一個完美的答案,已經存在。 –

+0

請添加您的數據庫後端。 'mysql','pg','sqlite'? –

+0

我面臨同樣的問題。 –

回答

0

那麼,SQLite不處理AFTER語法,所以在這種情況下,最好的解決方案是保留列的順序不變或創建新表。

2

您使用的是after選項,所以你可以合理地期望它把它:name後。

但是,這並沒有很好的記錄(如果有的話),但after選項只適用於某些DBMS(可能只有MySQL)。

我要做的就是添加自己的SQL來做到這一點,add_column電話後,就像這樣:

add_column :students, :foo, :string 
ActiveRecord::Base.connection.execute("ALTER table students MODIFY COLUMN foo varchar(255) AFTER name") 

你的SQL將需要DBMS特定的,即針對MySQL和PostgreSQL,SQLite的等。

+1

https://wiki.postgresql.org/wiki/Alter_column_position –