【问题标题】:Phoenix framework Ecto give default value to timestampPhoenix 框架 Ecto 为时间戳提供默认值
【发布时间】:2022-05-12 04:45:27
【问题描述】:

我想知道如何自动填充由 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”。

我必须先放下桌子才能工作吗?

【问题讨论】:

    标签: elixir phoenix-framework ecto


    【解决方案1】:

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

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

    【讨论】:

    • 这不应该是这样的......这必须由 timestamps() 函数管理。我将寻找“内置”解决方案。
    【解决方案2】:

    作为对 add() 的 timestamps() 调用,您可以直接传递选项 :default 并使用片段一次性设置。

    schema "users" do
      field :newsletter, :boolean, default: false
    
      timestamps(default: fragment("NOW()"))
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-08
      • 1970-01-01
      • 1970-01-01
      • 2020-05-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多