Add_column 迁移栏顺序
Add_column migration column order
我使用 Rails 4,SQLite 版本 3.8.2,我想向我的数据库添加新列。
我创建新迁移:
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 列,但不是在 name 列之后,而是添加在 table
的末尾
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
我完全不知道我做错了什么
您正在使用 after
选项,因此您可以合理地期望它将它放在 :name
之后。
但是,这并没有很好地记录(如果有的话),但是 after
选项仅适用于某些 DBMS(可能仅 MySQL)。
我所做的是在 add_column
调用之后添加我自己的 sql 来执行此操作,如下所示:
add_column :students, :foo, :string
ActiveRecord::Base.connection.execute("ALTER table students MODIFY COLUMN foo varchar(255) AFTER name")
您的 SQL 需要特定于 DBMS,即针对 MySql、PostGresql、SQLite 等量身定制。
嗯,SQLite 不处理 AFTER 语法,所以在这种情况下,最好的解决方案是保持列的顺序不变或创建新的 table。
我使用 Rails 4,SQLite 版本 3.8.2,我想向我的数据库添加新列。 我创建新迁移:
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 列,但不是在 name 列之后,而是添加在 table
的末尾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
我完全不知道我做错了什么
您正在使用 after
选项,因此您可以合理地期望它将它放在 :name
之后。
但是,这并没有很好地记录(如果有的话),但是 after
选项仅适用于某些 DBMS(可能仅 MySQL)。
我所做的是在 add_column
调用之后添加我自己的 sql 来执行此操作,如下所示:
add_column :students, :foo, :string
ActiveRecord::Base.connection.execute("ALTER table students MODIFY COLUMN foo varchar(255) AFTER name")
您的 SQL 需要特定于 DBMS,即针对 MySql、PostGresql、SQLite 等量身定制。
嗯,SQLite 不处理 AFTER 语法,所以在这种情况下,最好的解决方案是保持列的顺序不变或创建新的 table。