我使用Rails 4,SQLite版本3.8.2,我想在我的数据库中添加新列。 我创建了新的迁移:
public class DecimalDigitsInputFilter implements InputFilter {
private final Pattern mPattern;
public DecimalDigitsInputFilter(int digitsBeforeZero, int digitsAfterZero) {
mPattern = Pattern.compile(String.format("[0-9]{0,%d}(\\.[0-9]{0,%d})?", digitsBeforeZero, digitsAfterZero));
}
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
Matcher matcher = mPattern.matcher(createResultString(source, start, end, dest, dstart, dend));
if (!matcher.matches())
return "";
return null;
}
private String createResultString(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
String sourceString = source.toString();
String destString = dest.toString();
return destString.substring(0, dstart) + sourceString.substring(start, end) + destString.substring(dend);
}
所以我得到了:
rails g migration AddFooToStudents foo:string
然后我运行迁移:
class AddFooToStudents < ActiveRecord::Migration
def change
add_column :students, :foo, :string, after: :name
end
end
> Everythink似乎没问题,在数据库中添加了foo列,而不是在name列之后,它已添加到表的末尾
rake db:migrate
== 20150803095305 AddFooToStudents: migrating
=================================
-- add_column(:students, :foo, :string, {:after=>:name})
-> 0.0009s
== 20150803095305 AddFooToStudents: migrated (0.0011s)
========================
我完全不知道自己做错了什么
答案 0 :(得分:2)
您正在使用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等进行定制。
答案 1 :(得分:0)
好吧,SQLite不处理AFTER语法,因此在这种情况下,最好的解决方案是保持列的顺序不变或创建新表。