试图更改列的类型,但Rails尝试删除表

时间:2017-07-19 07:40:14

标签: ruby-on-rails rails-migrations ruby-on-rails-5.1

我试图更改表格列的数据类型。我尝试了两种不同的方法:

def change
    remove_column :users, :permission_level
    add_column :users, :permission_level, :integer
end

def change
    change_column :users, :permission_level, :integer
end

然而,在这两种情况下我都遇到了这个错误:

SQLite3::ConstraintException: FOREIGN KEY constraint failed: DROP TABLE "users"
/home/prios/blog/db/migrate/20170719071633_change_column_permission_level_from_string_to_integer.rb:3:in `change'
ActiveRecord::InvalidForeignKey: SQLite3::ConstraintException: FOREIGN KEY constraint failed: DROP TABLE "users"
/home/prios/blog/db/migrate/20170719071633_change_column_permission_level_from_string_to_integer.rb:3:in `change'
SQLite3::ConstraintException: FOREIGN KEY constraint failed
/home/prios/blog/db/migrate/20170719071633_change_column_permission_level_from_string_to_integer.rb:3:in `change'
Tasks: TOP => db:migrate

似乎Rails试图删除表而不是删除/更改其中一个列的数据类型,这是我不想要的。

更多信息:我试图更改/删除的列没有任何与之关联的外键。它是我尚未使用过的专栏。

1 个答案:

答案 0 :(得分:1)

SQLite不支持remove_column迁移方法。来自http://www.sqlitetutorial.net/sqlite-alter-table/

  

SQLite不支持ALTER TABLE DROP COLUMN语句。

显然,在SQLite中这是一个非常复杂的过程,您重命名现有表,创建一个没有要删除的列的新表,从原始表复制所有日期,然后删除原始表。当我第一次开始时,我遇到了这个问题,切换到Postgres并没有回头。