gpt4 book ai didi

elixir - 使用 Ecto 的时间戳向现有表添加时间戳

转载 作者:行者123 更新时间:2023-12-04 08:54:04 28 4
gpt4 key购买 nike

已在此处询问 How to add timestamps to an existing table with Ecto's timestamps? ,但是公认的解决方案意味着每个新条目都将具有相同的默认时间。我希望新条目具有正确的插入/更新时间。

例如。

# set default to given date to fill in all existing rows with timestamps
def change do
alter table(:my_table) do
timestamps(default: "2018-01-01 00:00:01")
end
end

如果这就是迁移中的全部内容, inserted_atupdated_at:my_table将 2018-01-01 00:00:01 作为值,无论插入/更新日期如何。

我想做的是:
  • 将日期时间添加到已存在的行的 insert_at 和 updated_at 列中。
  • inserted_atupdated_at应该是 null: false就像在向新创建的表中添加时间戳时一样。
  • future 的条目应该有正确的 insert_at 和 updated_at 值,即 insert_at 是创建行的时间,而 updated_at 是更改的时间,而不是迁移中的默认设置。

  • 我有几个解决方案可以实现这一点,但它们看起来很困惑。我正在寻找是否有更干净的方法来做到这一点,或者是否有处理我所缺少的这种情况的选项。

    工作迁移 1:
    def up do
    alter table(:my_table) do
    timestamps(default: "now()")
    end
    execute("ALTER TABLE my_table ALTER COLUMN inserted_at SET DEFAULT now()")
    execute("ALTER TABLE my_table ALTER COLUMN updated_at SET DEFAULT now()")
    end

    def down do
    alter table(:my_table) do
    remove :inserted_at
    remove :updated_at
    end
    end

    工作迁移2:
    def up do
    alter table(:my_table) do
    timestamps(null: true)
    end
    execute("UPDATE my_table SET inserted_at = now()")
    execute("UPDATE my_table SET updated_at = now()")
    alter table(:my_table) do
    modify :inserted_at, :naive_datetime, null: false
    modify :updated_at, :naive_datetime, null: false
    end
    end

    def down do
    alter table(:my_table) do
    remove :inserted_at
    remove :updated_at
    end
    end

    最佳答案

    您可以使用 fragment 提供 SQL 函数作为默认值。 .该文档提供了以下示例:

    create table("posts") do
    add :inserted_at, :naive_datetime, default: fragment("now()")
    end
    timestamps seems to forward the default: option to add ,因此在您的特定情况下,您应该能够执行以下操作:
    def change do
    alter table(:my_table) do
    timestamps(default: fragment("now()"))
    end
    end

    关于elixir - 使用 Ecto 的时间戳向现有表添加时间戳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49516123/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com