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。