SQLite中的串行
#网络开发人员 #database #sqlite #rails

今天,我在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,并留下有关如何完全创建表格到数据库适配器的决定。