今天,我在SQLITE数据库中使用CourseStatus.create!(name: 'Klettern für Anfänger')
创建新的Rails ActiveRecord
时收到了以下错误:
SQLite3::ConstraintException: NOT NULL constraint failed: course_statuses.id
问题是schema.rb
将主键定义为serial
(最初由Rails 5.0迁移创建):
create_table "course_statuses", id: :serial do |t|
t.string "name", limit: 255
t.datetime "created_at"
t.datetime "updated_at"
end
由于sqlite是dynamically typed,因此仅使用不存在的serial
来声明id
主键。这意味着SQLITE适配器不会标记可自动插入的主要键。只能在sqlite中自动进行INTEGER
类型。
解决方案是从schema.rb
(然后是db:schema:load db:schema:dump
)删除所有id: :serial
,并留下有关如何完全创建表格到数据库适配器的决定。