从字符串到文本的change_column上的Rails ActiveRecord SQlite3数据类型不匹配错误

时间:2018-11-27 14:27:20

标签: ruby-on-rails sqlite activerecord

我正在尝试将列的数据类型从字符串更改为ID。但是SQlite3让我很难受。这是我迁移中的唯一一行:

change_column :containers, :title, :text

运行迁移时,出现数据类型不匹配的错误:

SQLite3::MismatchException: datatype mismatch: INSERT INTO "acontainers" 

我很确定这是因为ActiveRecord创建了一个临时表,该表的id字段的数据类型为INT,而原始表实际上的数据类型为VARCHAR,如下所示:

CREATE TEMPORARY TABLE "acontainers" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,

问题是我不知道该如何解决。任何输入,我们将不胜感激!

1 个答案:

答案 0 :(得分:1)

看起来像SQLite包装器中的错误。 如果您不使用该版本,则可以尝试将其更新为最新版本。

作为解决方法,您可以分多个步骤进行迁移:

  1. 创建新列
  2. 写到两列
  3. 将数据从旧列回填到新列
  4. 将读取内容从旧列移动到新列
  5. 停止写入旧列
  6. 删除旧列

这也是一种更安全的方法,因为change_column可能会导致停机和错误 您可以在this gem description

中了解更多信息