在Rails或SQLite3中,“存档”是保留字吗?

时间:2019-04-02 08:22:05

标签: ruby-on-rails activerecord sqlite

迁移名为“ Archive”的模型后,所有测试均失败,并显示ActiveRecord /错误消息,如下所示:

ActiveRecord::NotNullViolation: SQLite3::ConstraintException: NOT NULL constraint failed: archives.created_at: INSERT INTO "archives" ("some_thing") VALUES ('MyString')

此操作隔离在新VM上的新Rails应用程序中按照Odin Project的安装说明,使用Ruby 2.6.1和Rails 5.2.3运行全新的Ubuntu 18.04.2安装。该问题仅在名为“ Archive”的模型的测试期间出现,并且删除模型的属性只会将错误更改为:

ActiveRecord::StatementInvalid: SQLite3::SQLException: incomplete input: INSERT INTO "archives"

我的工作流程如下:

{{2 }}

(在撰写本文时,将Gemfile中的sqlite3更改为使用版本“〜> 1.3.6”来修复错误)

rails new sample_app

cd sample_app

生成此迁移:

{ {2}}
bundle install

rails g model Archive

创建此架构:

class CreateArchives < ActiveRecord::Migration[5.2]
  def change
    create_table :archives do |t|

      t.timestamps
    end
  end
end
rails db:migrate

运行此测试:(未注释)

ActiveRecord::Schema.define(version: 2019_04_03_003144) do

  create_table "archives", force: :cascade do |t|
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end

end
< p>运行测试(通常是给定的测试)后,Rails返回上面列出的第一条ActiveRecord错误消息。 我觉得这里缺少一些东西,使我无法在模型中使用“存档”一词。

1 个答案:

答案 0 :(得分:0)

Archive不是保留字。您提供的链接在过去5年中没有更新。

其背后的原因是:

您正在创建存档记录,但未提供created_at中的必填字段updated_atschema

t.datetime "created_at", null: false
t.datetime "updated_at", null: false

解决方案:

要么更改您的迁移,以允许将nullcreated_at插入updated_at,要么请您test/fixtures/archive.yml并提供created_at和{{1} }。

喜欢:

updated_at

更新

第二个问题是因为您除了one: ....some fields.... created_at: 2018-08-30 14:41:23 updated_at: 2018-08-30 14:41:23 之外没有其他任何字段。删除该表并使用至少1个字段为Archive创建新模型。当前,Rails正在生成查询timestamp,SQL在此查询后需要数据,这就是它向您返回错误的原因。