Phoenix 框架 Ecto 为时间戳赋予默认值

Phoenix framework Ecto give default value to timestamp

我想知道如何自动填充由 timestamp() 生成的 "updated_at" 和 "inserted_at" 列。

目标是不指定这些值,因为它必须是自动的。 我知道如何处理其他列。

schema "users" do
  field :newsletter, :boolean, default: false

  timestamps(type: :utc_datetime)
end

我试过了

schema "users" do
  field :newsletter, :boolean, default: false
  field :inserted_at,:utc_datetime, default: :utc_datetime
  field :updated_at,:utc_datetime, default: :utc_datetime
end

但是当我 运行:

时,它似乎不起作用或者没有考虑到更改
mix ecto.migrate

是我的代码有误还是使用了错误的命令行?

在我的 SQL 模式中我有

newsletter  BOOLEAN DEFAULT FALSE NOT NULL,
inserted_at TIMESTAMP             NOT NULL,
updated_at  TIMESTAMP             NOT NULL,

不管我怎么努力,我不能在最后两行有 "DEFAULT TIMESTAMP"。

我必须先删除 table 才能工作吗?

要在数据库中设置列的默认值,您需要使用迁移。在 schema 声明中设置它不会影响数据库。像下面这样的东西应该在迁移中工作并使这两列默认为 NOW():

alter table(:users) do
  modify(:inserted_at, :timestamp, default: fragment("NOW()"))
  modify(:updated_at, :timestamp, default: fragment("NOW()"))
end

作为timestamps()对add()的调用,可以直接传选项:default,用一个fragment一步设置。

schema "users" do
  field :newsletter, :boolean, default: false

  timestamps(default: fragment("NOW()"))
end