Ecto迁移中如何动态更新字段值?

2024-03-25

我有一个用户表,例如:

     email     | username
---------------+----------
 [email protected] /cdn-cgi/l/email-protection   |
 [email protected] /cdn-cgi/l/email-protection   |
 [email protected] /cdn-cgi/l/email-protection |

我想更新username场由email字段,只需切片email before @.

     email     | username
---------------+----------
 [email protected] /cdn-cgi/l/email-protection   | 123
 [email protected] /cdn-cgi/l/email-protection   | 123
 [email protected] /cdn-cgi/l/email-protection | haha

我尝试使用以下迁移:

defmodule MyApp.Repo.Migrations.AddDefaultUsernameForUsers do
  use Ecto.Migration
  import Ecto.Query

  def up do
      from(u in MyApp.User, update: [set: [username: String.split(u.email, "@") |> List.first ]])
        |> MyApp.Repo.update_all([])
  end

  def down do
      MyApp.Repo.update_all(MyApp.User, set: [username: nil])
  end
end

但在运行迁移时,我收到以下错误:

$ mix ecto.migrate
** (Ecto.Query.CompileError) `List.first(String.split(u.email(), "@"))` is not a valid query expression

我该如何解决这个问题?


@Justin Wood 已经解释了为什么不能在更新查询中使用 Elixir 函数,所以我不会重复。在 PostgreSQL 中,您可以提取之前的文本@使用substring带有正则表达式的函数,它将与更新查询一起使用。这比加载记录然后逐一更新它们要快得多,但如果不调整 SQL 片段,则无法与其他数据库引擎一起使用:

from(u in MyApp.User,
  update: [set: [username: fragment("substring(? from '^(.*?)@')", u.email)]])
|> MyApp.Repo.update_all([])
postgres=# select substring('12[email protected] /cdn-cgi/l/email-protection' from '^(.*?)@');
 substring
-----------
 123
(1 row)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Ecto迁移中如何动态更新字段值? 的相关文章

随机推荐

  • PostgreSQL upsert 查询的问题

    我正在尝试通过更新或插入新记录来更新数据库投票用户表 该表定义如下 Column Type Modifiers id integer not null default nextval vote user table id seq regcl
  • 如何对类或函数定义进行哈希处理?

    背景 在尝试机器学习时 我经常通过 pickling unpickling 的方式重用之前训练过的模型 然而 在进行特征提取部分时 不混淆不同的模型是一个挑战 因此 我想添加一项检查 以确保使用与测试数据完全相同的特征提取过程来训练模型 P
  • 使用 nginx proxy_pass 和重写的多个 django 应用程序

    我有一个名为的 django admin 应用程序myapp我想在不同的物理盒子上部署多个实例 每个客户一个 但是 我希望它们都可以从类似的域访问 mydomain com customer1 myapp 我摆弄了特定的代理设置 并尝试了多
  • 如何在 JSF2 中将一个 @Named bean 注入到另一个 @Named bean 中?

    我有以下代码 Named RequestScoped public class SearchBean private String title private String author getters and setter s In se
  • C++ 中的结构对齐

    struct Vector float x y z func Vector vectors usage load float coords load file func coords 我有一个关于 C 中结构对齐的问题 我将把一组点传递给函
  • 如何检测scala执行上下文耗尽?

    我的 Playframework 应用程序有时没有响应 我想在运行时检测到这一点 记录有关当前在耗尽的执行上下文上运行的内容的信息 实现这一目标的最佳策略是什么 我考虑过将小型可运行对象发布到执行上下文 如果它们没有及时执行 我会记录一条警
  • 在 TabLayout 支持库中以编程方式设置选项卡指示器位置

    在我的应用程序中 我使用支持库中的 TabLayout 和视图寻呼机 其中有 3 个片段 假设我在 fragA 中 其中有一个按钮 单击该按钮会将我带到 fragB 我成功地转到 fragB 但唯一的问题是选项卡指示器保留在fragA Co
  • Meteor:读取简单的 JSON 文件

    我正在尝试使用 Meteor 读取 JSON 文件 我在 stackoverflow 上看到了各种答案 但似乎无法让它们发挥作用 我有试过这个 https stackoverflow com questions 22004412 how t
  • 如何使用 WPF 获得本机“外观和感觉”?

    我刚刚开始开发 WPF 应用程序 这不是我的第一个 WPF 应用程序 但它将是第一个需要改进的应用程序 我对 WPF 的 管道 了解很多 例如绑定等 但对如何完善它知之甚少 我不需要时髦的用户界面 我只需要一些看起来像本机 Windows
  • 从 Trello 身份验证中获取“未找到应用程序”

    我正在尝试调用 Trello API 的身份验证部分以获得用户令牌 我正在使用这个网址 https trello com 1 authorize callback method postMessage return url http 3A
  • python 模拟和未安装的库

    我正在为机器人开发软件 该软件通常在 Raspberry Pi 上运行 让我们考虑两个文件的导入 motor py 运行电机 from RPi import GPIO as gpio and client py 与服务器通信并将命令转发给电
  • 检查用户的 Postgres 访问权限

    我已经查看了文档GRANT Found here http www postgresql org docs 9 0 static sql grant html我试图看看是否有一个内置函数可以让我查看数据库的可访问性级别 当然有 dp and
  • 需要 viber webservice 或 api 地址 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否有任何 api 或 web 服务可以通过 c net 通过 viber 发送消息并获得交付 我用谷
  • 在 Flink 中,我可以在同一个槽中拥有一个算子的多个子任务吗?

    探索Apache Flink几天了 对Task Slot的概念有些疑惑 虽然有人问了几个问题 但有一点我不明白 我正在使用一个玩具应用程序进行测试 运行本地集群 我已禁用运算符链接 我从文档中知道插槽允许内存隔离而不是 CPU 隔离 阅读文
  • 使用STL的红黑树内部实现

    我知道我的STL g 4 x x附带 使用红黑树来实现地图等容器 是否可以直接使用STL内部的红黑树 如果是这样 怎么办 如果不是 为什么不 为什么STL不公开红黑树 令人惊讶的是 我无法使用谷歌找到答案 编辑 我正在研究使用红黑树作为插入
  • Android - 如何将 html 转换为 pdf? [复制]

    这个问题在这里已经有答案了 可能的重复 如何在 Android SDK 中创建 PDF https stackoverflow com questions 2499960 how to create pdfs in android sdk
  • Android:清单合并因多个错误而失败,请使用 Braintree 查看日志

    当我添加时 我收到此错误Braintree dependency 执行失败 for task vtg processDevDebugManifest 清单合并失败并出现多个错误 请参阅日志 Braintree 版本 应用程序 Gradle
  • 旋转图像后如何合并两个图像?

    旋转图像后如何合并旋转图像 我使用下面的代码 它在图像旋转之前工作正常 如何解决这个问题 请帮我 提前致谢 CGRect backgroundImageRect CGRectMake 0 0 0 0 itemSize width itemS
  • 如何使用 Jinja2 模板提供博客摘录而无需显示 html 代码?

    目前 我正在将 jinja2 与 Flask 结合使用 并使用 ckeditor 在数据库中存储了一篇博客文章 理想情况下 数据应首先显示图像 然后显示博客文章和外部链接到 flikr 的其他一些图像 我知道我可以使用 post body
  • Ecto迁移中如何动态更新字段值?

    我有一个用户表 例如 email username email protected cdn cgi l email protection email protected cdn cgi l email protection email pr