为什么这个 Rails 迁移会给出'no such table'错误?



在一个新的Rails6项目中,我有一个名为object_classes的表,其中有一列名为ClassList_id。来自schema.rb:

create_table "object_classes", force: :cascade do |t|
t.string "name"
t.integer "ClassList_id", null: false
t.datetime "created_at", precision: 6, null: false
t.datetime "updated_at", precision: 6, null: false
t.index ["ClassList_id"], name: "index_object_classes_on_ClassList_id"
end

我已经意识到该列应该命名为class_list_id,以符合Rails预期的命名约定。因此,我生成了一个新的迁移:

class FixColumnName < ActiveRecord::Migration[6.0]
def change
rename_column :object_classes, :ClassList_id, :class_list_id
end
end

然而,当我运行此迁移时,我会得到以下错误:

/bin/bash -c "env RBENV_VERSION=2.6.1 /home/asfarley/.rbenv/libexec/rbenv exec bundle exec ruby /home/asfarley/imgseq/bin/spring rails 'db:migrate'"
== 20200716060501 FixColumnName: migrating ====================================
-- rename_column(:object_classes, :ClassList_id, :class_list_id)
rails aborted!
StandardError: An error has occurred, this and all later migrations canceled:
SQLite3::SQLException: no such table: main.ClassLists
/home/asfarley/imgseq/db/migrate/20200716060501_fix_column_name.rb:3:in `change'
/home/asfarley/imgseq/bin/rails:9:in `<top (required)>'
/home/asfarley/imgseq/bin/spring:15:in `require'
/home/asfarley/imgseq/bin/spring:15:in `<main>'
Caused by:
ActiveRecord::StatementInvalid: SQLite3::SQLException: no such table: main.ClassLists
/home/asfarley/imgseq/db/migrate/20200716060501_fix_column_name.rb:3:in `change'
/home/asfarley/imgseq/bin/rails:9:in `<top (required)>'
/home/asfarley/imgseq/bin/spring:15:in `require'
/home/asfarley/imgseq/bin/spring:15:in `<main>'
Caused by:
SQLite3::SQLException: no such table: main.ClassLists
/home/asfarley/imgseq/db/migrate/20200716060501_fix_column_name.rb:3:in `change'
/home/asfarley/imgseq/bin/rails:9:in `<top (required)>'
/home/asfarley/imgseq/bin/spring:15:in `require'
/home/asfarley/imgseq/bin/spring:15:in `<main>'
Tasks: TOP => db:migrate
(See full trace by running task with --trace)
Process finished with exit code 1

我在这里做错了什么?我正在寻找一个解释,具体解决这里的错误,这样我就可以了解如何在未来避免这种情况。

很难知道故障是Rails还是SQLite,但问题似乎是我为object_classes表定义了一个外键,指向一个不存在的表。通过这次迁移,我能够修复外键约束并重命名列:

class FixColumnName < ActiveRecord::Migration[6.0]
def change
remove_foreign_key :object_classes, :ClassLists
rename_column :object_classes, :ClassList_id, :class_list_id
add_foreign_key :object_classes, :class_lists
end
end

您的语法是正常的,因此错误必须是保留名称错误。可能会尝试删除该列并再次创建该列,请注意迁移时的大写字母,因为它们会使代码不必要地复杂化。试试这个:

rails g migration RemoveClassListIdFromObjectClasses

这将创建一个类似这样的迁移:

def drop 
remove column :object_classes, :class_lis_id
end 

然后运行

rails g migration AddClassListIdToObjectClasses

迁移应该是这样的:

def change
add_column :object_classes, :class_list_id
end

请记住添加数据类型和您可能需要的任何其他内容。在那里,你可以检查它创建的迁移,你可以更改它,也许添加数据类型,也许更改列的大小写,你就可以开始了。

注意:如果有效的话,如果你接受这个答案,我将不胜感激,谢谢!

相关内容

最新更新