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

2024-01-10

这已被问到这里如何使用 Ecto 的时间戳向现有表添加时间戳? https://stackoverflow.com/questions/35744390/how-to-add-timestamps-to-an-existing-table-with-ectos-timestamps,但是接受的解决方案意味着每个新条目都将具有相同的默认时间。我希望新条目具有正确的插入/更新时间。

eg.

# 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

如果这就是迁移的全部内容,every inserted_at and updated_at for :my_table无论插入/更新的日期如何,都会将 2018-01-01 00:00:01 作为值。

我想做的是:

  1. 将日期时间添加到已存在行的 insert_at 和 Updated_at 列中。
  2. inserted_at and updated_at应该null: false就像向新创建的表添加时间戳时一样。
  3. 未来的条目应该具有正确的 Inserted_at 和 Updated_at 值,即 Inserted_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

您可以使用以下命令提供 SQL 函数作为默认值fragment https://hexdocs.pm/ecto_sql/Ecto.Migration.html#fragment/1。该文档提供了以下示例:

create table("posts") do
  add :inserted_at, :naive_datetime, default: fragment("now()")
end

timestamps似乎转发default:选项add https://github.com/elixir-ecto/ecto_sql/blob/2e1378eb5d65c2f34d49b595891e7ab482b44507/lib/ecto/migration.ex#L962-L972,因此根据您的具体情况,您应该能够执行以下操作:

def change do
  alter table(:my_table) do
    timestamps(default: fragment("now()"))
  end
end
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Ecto 的时间戳向现有表添加时间戳 的相关文章

  • 当作为函数参数传递时,elixir 是否会生成映射的副本?

    换句话说 我想知道在 Elixir 中 映射是通过值还是通过引用传递给函数 鉴于 Elixir 的无副作用原则 我怀疑这是有价值的 但是大地图不会造成巨大的重复效率低下吗 在此先感谢您的帮助 由于 Elixir 中的所有术语都是不可变的 因
  • Elixir / Erlang Dialyzer:为什么行为回调的参数类型应该是子类型而不是超类型?

    我有一个行为 X 和一个参数类型的回调函数 a any 模块 Y 实现行为 X 实现模块 Y 中的回调函数具有参数类型 a any b any Dialyzer 不喜欢这样并抱怨 a b gt is not a supertype of a
  • 如何在没有 javascript 的情况下从表单中修补或删除

    我正在 Phoenix 上编写一个简单的 CRUD 应用程序 如何在不使用 JavaScript 的情况下从表单提交 PATCH 和 DELETE 请求 啊我想通了 和rails一样
  • Dialyzer 无法识别使用多态类型的函数中的错误

    背景 我正在尝试使用透析器进行多态打字 作为一个例子 我正在使用著名的Option类型 又名 Maybe Monad 现在在许多其他语言中都很流行 defmodule Test do type option t some t nothing
  • Ecto - 验证关联模型的存在

    如何验证 Ecto 中是否存在关联模型 schema foo do has many bar Bar timestamps end required fields w bar invalid 有办法这样做吗 并验证这些字段的最小 最大数量
  • Elixir 中的递归和匿名函数

    我正在尝试定义一个匿名函数来执行点积 我可以将其编码为私有函数 没有任何问题 但我正在努力解决匿名函数语法 我知道我可以以不同的方式实现这一点 但我试图了解如何使用模式匹配和递归来定义匿名函数 这是我当前的实现 dot fn i input
  • 如何在phoenix中使用session连接?

    我有一个身份验证插头 我想测试我的控制器 问题是这个插头里的线有 user id get session conn user id 当我使用这种方法时它总是为零 我以前使用过dirty hack 但我不再想这样做 session Plug
  • GenServer 正常关闭

    我使用 GenServer 编写了一个 Elixir 应用程序 该应用程序在启动时启动外部应用程序 然后将其关闭 并在退出时进行其他清理 我在中添加了启动功能init 1 https hexdocs pm elixir GenServer
  • 启动混合任务流程依赖项

    Elixir 新手 但到目前为止很喜欢它 我的很多混音任务都依赖于 HTTPotion My mix exs文件被声明为这样 def application do applications logger cowboy plug httpot
  • 如何在 Elixir 中将字符串转换为 Ecto.DateTime?

    我需要将包含有效 UTC 时间的字符串转换为Ecto DateTime一个 稍后我会将其以正确的格式插入到我的数据库中 我尝试过使用Ecto DateTime cast date 方法但似乎不起作用 该字符串是Sat Aug 04 11 4
  • 如何完全禁用 Elixir/Phoenix 生成器和模型中的上下文?

    凤凰城有一个发电机 mix phx gen html Accounts User users name string age integer 我不想为我的模型使用上下文 也不想提供它的名称 如何禁用它 您仍然可以使用 1 2 及更早版本中的
  • 如何在 Elixir 中截断字符串?

    我正在使用长生不老药的鼻涕虫 想法是 我有一个字符串 a zA Z0 9 用连字符分隔的单词 喜欢 string another long string to be truncated and much text here 我想确保最大字符
  • 使用 Elixir 生成首字母头像 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在开发 Elixir 并希望提供头像服务 如果用户没有头像 可以制作一个带有他们姓名首字母缩写的头像 如下所示 我真的不知道从哪里
  • Elixir 中的小数四舍五入

    我有这个十进制数 Elixir c1 Decimal div a1 b1 gt Decimal lt 0 006453859622556080696687234694 gt 如何将其四舍五入为小数点后位数较少的较短数字 正如 Dogbert
  • 让 Ecto 查询更高效

    我正在尝试查看当前用户的团队是否与传入的用户团队重叠 我有一些有用的东西 但我很好奇它是否能让我更有效率 这是我所拥有的 user teams from t in MyApp Team left join a in assoc t acco
  • 与 ecto 的逆多态性

    当前的 Ecto 文档http hexdocs pm ecto Ecto Schema html http hexdocs pm ecto Ecto Schema html仅解释如何构建belongs to多态关联的类型 当多态Commen
  • Elixir 中的斜线符号是什么意思?

    在 Elixir 文档中 他们继续使用带有斜杠的奇怪符号 例如 is boolean 1 IO puts 1 String length 1 is function 2 2 我只是猜测 但我认为它指的是数量 但如果是这样的话 为什么文档中没
  • 如何在 Elixir 中展平嵌套列表?

    我有一个嵌套列表 1 2 3 4 5 6 我怎样才能把它压平 使它变成 1 2 3 4 5 6 无需重新发明轮子 只需使用List flatten 1 https hexdocs pm elixir List html flatten 1
  • Phoenix:在模板内分配值的渲染模板

    我正在尝试使我的应用程序干燥且模块化 但是 当我尝试将一个组件 小模板 放入另一个模板 较大的模块 中 该组件接收调用 实例化 时传递的动态值时 我收到此错误 assign conn not available in eex templat
  • Elixir assert_raise 无法捕获异常

    我写了这个测试用例 assert raise ArgumentError myFn a b 但它并没有按照我期望的方式进行评估 myFn引发一个 ArgumentError do raise ArgumentError 但它没有被捕获ass

随机推荐

  • 模拟 raw_input python

    我有这个函数应该接收列表 x y def input origem origem raw input Entre com o valor de x origem eval origem return origem def input sai
  • 发生 500 错误时向管理员发送电子邮件

    在 python 中 当发生 500 错误时 如何向管理员发送电子邮件 我使用的网络框架是 bottle 只需使用 error code 装饰器来定义错误处理页面 如下所示 from bottle import run error rout
  • 如何使用按钮添加更多输入字段 - Angular 2 动态表单

    所以我在这里使用了指南 https angular io docs ts latest cookbook dynamic form html https angular io docs ts latest cookbook dynamic
  • 通过 JNI C 代码将 PNG 图像作为 BufferedImage 加载到 Java 中

    我有以下问题 我有 C 代码 它获取 PNG 图像作为基本原始数据并将其保存在内存中 我希望通过使用 JNI 将这些原始数据转换为 Java 中的 BufferedImage 有谁知道这样做的任何方法或以前做过吗 我假设您了解如何使用 JN
  • Angular Typescript getter 和 setter 返回未定义

    我有一个类 我需要该类中的属性来返回对象中的一些字段 我在 Net 中这样做过几次 但在 Angular 中 我正在与返回的 未定义 作斗争 我可以确认属性 transLanguageId transLangDesc 翻译 已填充到 IBa
  • 如何解决 VS2013 错误 SQL71501:过程 X 对程序集 Y 存在未解析的引用?

    作为从 Visual Studio 2010 升级到 2013 的努力的一部分 我正在研究几个需要的 SQL Server CLR 存储过程EXTERNAL访问 并为此目的被隔离在一个单独的程序集中 我几乎可以毫无困难地构建所有东西 但这给
  • 如何更改 Capistrano 使用的临时目录?

    如何更改 Capistrano 使用的临时目录 示例 代替 tmp 我想用 home user tmp 我目前的VPS有 tmp安装为noexec 这在尝试运行时给了我权限被拒绝的错误cap production deploy 在 卡皮斯特
  • 用于撰写 Facebook 电子邮件/消息的 URL(通过 URL 参数撰写电子邮件)

    Facebook 过去使用以下 URL 格式来撰写消息 http www facebook com compose id XXXXXX message 然而 上面的 URL 不再起作用 它只是将用户转发到 Facebook 主页 有人可以通
  • 有没有办法以编程方式确定图像链接是错误的?

    在我正在处理的网站中 显示的图像并不总是 显示 因为链接可能是坏的或过时的 或其他什么 你可以在这里看到它 为什么我的动态 HTML 看起来是随机放置的 https stackoverflow com questions 17689644
  • 在 Facebook 上分享的人员列表

    我已经搜索文档有一段时间了 但似乎找不到实现此目的的方法 这些信息是公开的 在 Facebook 页面上 链接显示 查看所有 股 但我似乎找不到通过 FQL 或图形 API 访问此信息的方法 我知道我可以获得给定帖子的点赞列表 https
  • Haskell 中“undefined”的类型签名意味着什么?

    我是 Haskell 的初学者 我对undefined函数的类型签名 我期望有更简单的东西 但我在 Hackage 上发现了这个 undefined forall r RuntimeRep forall a TYPE r HasCallSt
  • 自引用表 SQL 查询

    我有一个有四列的表格id name designation manager id 表架构 CREATE TABLE Employee Information id INTEGER PRIMARY KEY AUTOINCREMENT NOT
  • excel中的数组改变字符串的格式

    我想要分离图像中的数据 图像中的代码一旦到达分号和缩进就不会分开 我想将这些单词分离到一张新纸上 以便我将在数组中搜索某些单词 谢谢您的帮助 下面的代码不仅会分割数据 还会复制格式 这似乎是您想要的 假设数据位于 A 列 Option Ex
  • Windows Phone 8.1 API

    有 Windows Phone 8 1 API 可供参考吗 这是因为我想开发Windows Phone 8 1应用程序 但我不知道在哪里引用API 因为Windows Phone 8 1和8有很大的不同 所以我无法引用Windows Pho
  • 点击即可从 SwiftUI 小部件执行深层链接

    我有一个带有两个文本的简单小部件 中等大小 我想要的是能够执行深层链接以引导用户到我的应用程序的特定部分 但我似乎找不到一种方法这样做 我写的视图 很简单 HStack Text FIRST ITEM Spacer Text SECOND
  • liquibase <插入> :插入当前日期

    我正在尝试使用 liquibase 插入标签插入数据 当我向 value tag 输入数字时 它工作正常 但我正在寻找一个简单的函数来处理默认日期 数据库的当前日期时间 即使我没有将它作为表定义的一部分 Eg
  • 如何将 null 传递给需要 long 或 int 的方法?

    可能是个愚蠢的问题 但我怎样才能通过null到需要的方法long or int Example TestClass public void iTakeLong long id public void iTakeInt int id 现在我如
  • MicroProfile 指标在 Wildfly 25 上不显示自定义指标

    我正在尝试 Javax JaxRs 并且使用的是 WildFly 25 服务器 我对此不太熟悉 在搜索类似于 Spring 的 Actuator 的东西时 我偶然发现了服务器默认公开的指标和运行状况端点 以及它向应用程序端点添加自定义计数器
  • Ember:点击时动态添加输入字段并读取新数据

    我有一个页面 向用户展示几个问题并提供答案的输入字段 我还有一个按钮添加问题 单击此按钮后 他可以在新的输入字段中输入问题 然后单击 保存 所以我需要的是 当他保存时 新输入的问题也应该显示在已经显示的问题附近 所以我对模型有疑问 impo
  • 使用 Ecto 的时间戳向现有表添加时间戳

    这已被问到这里如何使用 Ecto 的时间戳向现有表添加时间戳 https stackoverflow com questions 35744390 how to add timestamps to an existing table wit