Phoenix 框架中的动态模型

2023-11-27

有没有办法在Phoenix中动态创建和使用模型?我有一个存储有关客户表的元数据的应用程序:它们设置了一些字段(列名称和类型),然后向我发送 CSV 文件以进行解析和存储。我想根据存储的元数据生成一个模型,以便我可以使用 Ecto 来管理客户端表并对其执行查询。

我有 Django 背景,可以使用内置的 ORM 并type()函数可以动态构建模型,然后使用它们,而无需在应用程序中生成迁移或其他模型代码。

在Python中,我会(大致)这样做:

class MetaModel(models.Model):
    table_name = models.CharField(...)
    model_name = models.CharField(...)
    field_defs = JSONField(...)

    def resolve_fields(self):
        # takes values from `field_defs` and converts them into
        # django field instances

     def get_model(self):
         class Meta:
             app_label = 'dynamic'
             db_table = self.table_name
         fields = self.resolve_fields()
         attrs = {'__module__': 'dynamic', 'Meta': Meta}
         attrs.update(fields)
         model = type(self.model_name, (models.Model,), attrs)
         return model

     def create_table(self):
         with connection.schema_editor() as se:
             model = self.get_model()
             se.create_model(model)

这样,我就可以在数据库中创建表,然后利用 ORM 来处理客户端提供的数据。

我知道我可以使用原始 SQL 来完成此操作,只需使用 Ecto 来运行命令和查询,但我想让它更加编码化并依赖于 Ecto 的内部结构,而不是编写和维护一堆 SQL 模板。

任何建议(即使是“不,你不能这样做”)都非常有帮助。谢谢!


是的,这是可能的Module.create/3。有一些注意事项:您需要为每个模块选择一个唯一的名称,并且模块的代码将驻留在内存中,直到 VM 重新启动,因此您可能需要限制调用此函数的次数。

这是您可以构建的基本实现。它允许您传递模块名称、表名称以及字段名称和类型对的列表。

defmodule A do
  def go(module, table, fields) do
    Module.create(module, quote do
      use MyApp.Web, :model
      schema unquote(table) do
        unquote(for {name, type} <- fields do
          quote do
            field unquote(name), unquote(type)
          end
        end)
      end
    end, Macro.Env.location(__ENV__))
  end
end

A.go MyPost, "posts", [
  {:title, :string},
  {:content, :string},
]

# MyPost is now just like any other Schema module in Phoenix.

IO.inspect MyApp.Repo.all(MyPost)

Output:

[debug] QUERY OK source="posts" db=2.8ms queue=0.1ms
SELECT p0."id", p0."title", p0."content" FROM "posts" AS p0 []
[%MyPost{__meta__: #Ecto.Schema.Metadata<:loaded, "posts">,
  content: "Hello from Joe", id: 1, title: "Hello"},
 %MyPost{__meta__: #Ecto.Schema.Metadata<:loaded, "posts">,
  content: "Hello from Mike", id: 2, title: "Hello"},
 %MyPost{__meta__: #Ecto.Schema.Metadata<:loaded, "posts">,
  content: "Hello from Robert", id: 3, title: "Hello"}]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Phoenix 框架中的动态模型 的相关文章

  • Elixir - 递归列表值的总和

    只是尝试对列表值进行简单求和 defmodule Mth do def sum list do 0 end def sum list H T do H sum list T end end IO puts Mth sum list 1 2
  • Ecto 构建多个关联

    目前正在使用 Ecto Postgres 从事 Phoenix 项目 创建评论时 作为评论belongs to用户和文章 有没有一种方法可以构建多个关联来生成一个变更集 像这样的伪代码 comment changeset build ass
  • 套接字无法连接到端点

    var socket new Socket localhost 4000 socket connect Returns WebSocket connection to ws localhost 4000 ws failed Error du
  • Phoenix:订购查询集

    我 一个菜鸟 为了好玩而玩弄 Phoenix 框架并构建一个小型 Twitter 克隆 我一切正常 但是 我想按updated at字段 升序 正如您从 tweet controller 中看到的 我尝试过使用 order by 子句 但这
  • 如何在没有 javascript 的情况下从表单中修补或删除

    我正在 Phoenix 上编写一个简单的 CRUD 应用程序 如何在不使用 JavaScript 的情况下从表单提交 PATCH 和 DELETE 请求 啊我想通了 和rails一样
  • 可以用宏获取评论吗?

    我试图解析一些代码并重新格式化它们 但似乎引用只会忽略注释 有什么办法可以实现这一点吗 我想我必须深入 erlang 方面 不 您无法在宏内获取代码注释 它们永远不会成为 AST 的一部分 并且仍然被丢弃在 Elixir 的标记器中
  • Ecto 模型 - select 中的子查询

    我需要使用 Ecto 进行 SQL 查询 SELECT users select count 0 from money transactions where from id users id AND created at gt 2016 1
  • Ecto 和 Elixir 的默认日期时间

    我今天刚刚开始使用 Elixir 和 Phoenix 我正在尝试添加 Ecto 作为映射器 但我在使用时间时遇到了一些问题 这是我的模型 schema users do field name string field email strin
  • Dialyzer 无法识别使用多态类型的函数中的错误

    背景 我正在尝试使用透析器进行多态打字 作为一个例子 我正在使用著名的Option类型 又名 Maybe Monad 现在在许多其他语言中都很流行 defmodule Test do type option t some t nothing
  • Elixir 中的递归和匿名函数

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

    我读到的有关 Elixir 的所有内容都表明 赋值应该被视为模式匹配 如果是这样 为什么 x x 1 在 Elixir 中有效 不存在 x x 1 的 x 值 我读到的有关 Elixir 的所有内容都表明 赋值应该被视为模式匹配 在长生不老
  • 如何编写在日期时间字段上执行 group_by MONTH 的 Ecto 查询

    我正在执行 ecto 查询并尝试进行分组q created date 此查询成功执行了 GROUP BY 但它是按秒执行的 我正在尝试按月分组 MYQUERY gt group by q q created date q id 有没有类似的
  • 使用 Ansible 将二进制文件添加到 PATH

    我正在尝试安装Kiex https github com taylor kiex版本管理器Elixir http elixir lang org install html使用 Ansible 的编程语言 这些是我为此使用的戏剧 name K
  • 如何在 Elixir 中截断字符串?

    我正在使用长生不老药的鼻涕虫 想法是 我有一个字符串 a zA Z0 9 用连字符分隔的单词 喜欢 string another long string to be truncated and much text here 我想确保最大字符
  • Elixir Jason 使用元组对结构进行编码

    我有一个已经有的结构 derive Jason Encoder但该结构中的某些字段是元组 因此无法对结构进行编码 我该如何解决这个问题 UPDATE 我使用了下面提到的方法来实现协议 关于这种方法需要注意的一件重要事情是 它将改变整个项目的
  • 如何在简单的 Elixir 脚本中加载 Elixir 库?

    在 ruby 脚本中 我可以简单地执行以下操作 require some gem SomeGem do something 我怎样才能在 Elixir 中做类似的事情exs脚本而不创建一个全新的混合项目 到目前为止 我已经在谷歌上搜索了执行
  • Phoenix 框架 - 每个路由的页面标题

    在 Phoenix 框架中 有一种基于路由 路径设置页面标题的常用技术 或者这只是一个调用的问题assign page title fred 在我的路由函数内的正确位置 Update 我最终实现了 michalmuskala 解决方案的变体
  • Elixir 中的小数四舍五入

    我有这个十进制数 Elixir c1 Decimal div a1 b1 gt Decimal lt 0 006453859622556080696687234694 gt 如何将其四舍五入为小数点后位数较少的较短数字 正如 Dogbert
  • Elixir 如何将 Map 结构转换为 Record 结构

    我有一个 Record 结构和一个 Map 结构 例如 defmodule Foo Bar do defstruct boo nil baz nil end defmodule Foo do require Record Record de
  • Elixir:模式匹配对于元组和映射的工作方式不同

    在 Elixir 中 如果我尝试模式匹配以下两个元组 a 1 2 我收到匹配错误 但如果我对两张地图做同样的事情 x a x 1 y 2 它工作正常 并且a绑定到 1 我可以明白为什么匹配两个元组会出错 但为什么匹配映射不会出错 在第一个示

随机推荐

  • 使用 Numpy 和 Cython 加速距离矩阵计算

    考虑一个维度为 NxM 的 numpy 数组 A 目标是计算欧几里德距离矩阵 D 其中每个元素 D i j 是行 i 和 j 之间的欧几里德距离 最快的方法是什么 这并不完全是我需要解决的问题 但它是我正在尝试做的事情的一个很好的例子 一般
  • 从电子邮件提交表格

    我正在开发一个通过电子邮件提交表单的项目 场景是这样的 我们将向电子邮件列表发送一份表格 客户必须在其中填写表格 一旦他们点击 提交 就应该提交表格 并且服务器应该能够检索填写者提供的值 当我尝试过 它没有将提交按钮视为表单提交 并且没有执
  • 在关系数据库中,我们可以拥有一个与其他表没有任何关系的表吗?

    在关系数据库中 我们可以拥有一个与其他表没有任何关系的表吗 是的 关系的表达方式是使用外键 如果您生成的表没有外键 并且其他表中没有外键指向该表 则它没有关系 不过 以后仍然可以建立关系 所以不要担心搬起石头砸自己的脚
  • 如何访问R中传单生成的地图

    假设我有这样的代码 Install devtools if needed if require devtools install packages devtools view rawif devtools R hosted with by
  • 如何在 git 中设置临时存储库?

    我想创建一个存储库 B 在名为 x master 的分支中跟踪远程存储库的主服务器 A 它自己的主控在初始创建时也应该是一个克隆 其他 开发人员 可以克隆并将更改推送到其中 有时 由于 A 中有更改 我需要能够将它们拉下来并将它们合并到 B
  • std::ifstream 缓冲区缓存

    在我的应用程序中 我试图合并排序的文件 当然要保持它们排序 因此我必须迭代两个文件中的每个元素 以将最小值写入第三个文件 这在大文件上运行得相当慢 因为我没有看到任何其他选择 必须完成迭代 我正在尝试优化文件加载 我可以使用一定量的 RAM
  • SQL CTE 和 ORDER BY 影响结果集

    我在下面粘贴了一个非常简化的 SQL 查询版本 我遇到的问题是ORDER BY语句正在影响我的 CTE 的选择结果 我一直无法理解为什么会这样 我最初的想法是在 CTE 中 我执行了一些SELECT声明 然后ORDER BY应该致力于那些结
  • Kotlin 协程中的 launch/join 和 async/await 有什么区别

    In the kotlinx coroutines库 您可以使用以下任一方式启动新的协程launch with join or async with await 它们之间有什么区别 launch习惯于即发即忘协程 这就像开始一个新线程 如果
  • imap_unordered,但带有惰性扁平生成器

    我有一个已经可以解决的问题multiprocessing Pool但解决方案并不是非常理想 也就是说 我拥有一组相当小的输入 每个输入都映射到一个大数据集 虽然我可以使用imap unordered对于返回列表的函数 这远非高效 因为每个大
  • PHP 生成的 csv 文件在 Excel 2007 中显示英镑符号 (£) 的 £

    我使用以下标头命令生成 csv 文件 header Content type text csv charset utf 8 encoding utf 8 header Content Disposition attachment filen
  • 32 位系统上的 Java 10(及更高版本)

    据我所知 oracle 没有计划为 32 位提供 java 但也许我误解了情况 如果我是对的 如果我们需要支持 32 位库 dll 我们该怎么办 那么 32 位操作系统又如何呢 目前这似乎对未来产生巨大影响 但正如我所说 也许我错了 事实上
  • 在 PyQt 中(很好地)显示代数表达式 [重复]

    这个问题在这里已经有答案了 在我的 python 程序中 有一个我创建的数学对象的层次结构 它们代表数学公式 例如 有Collection 这是一系列Equations 这是一个包含两个的容器Sums Products Quotients
  • 设置autoDeploy和deployOnStartup会导致应用程序在启动时部署两次?

    我正在阅读 Damonar Chetty 撰写的 Tomcat 6 开发人员指南 他在主机章节中说道 将两者设置为 true 将导致应用程序在启动时部署 然后在 Tomcat 启动并运行后再次部署 因此 请确保至少将其中一项设置为 fals
  • 在 foreach 循环内部或外部声明变量:哪个更快/更好?

    其中哪一个更快 更好 这个 List
  • 在 Java 中使用 BouncyCastle 通过 ECIES 进行加密

    我正在尝试使用 Java 中的 BouncyCastle 使用 ECC 算法加密一些内容 但我收到 BouncyCastle 库的异常 说无法投射JCEECPublicKey to IESKey 据我了解 生成的公钥KeyPairGener
  • mvc4 项目中的 Intellisense 无法在 vs 2012 professional 中工作?

    在我的剃刀视图中 智能感知不起作用 有解决这个问题的方法吗 我正在使用新发布的 VS 2012 Professional 并构建一个 ASP NET MVC 4 项目 我的剃刀视图中的智能感知不起作用 有什么解决办法吗 对我有帮助的是删除
  • Android - 如何动态更改片段布局

    我有一个平板电脑应用程序 其中包含一个显示我公司数据的 about 片段 我想在页面上时根据屏幕方向动态更改布局 但我还没有找到方法 如果有人找到解决方案 请提前致谢 Yume177 我找到了怎么做 Override public void
  • Git 子模块在 TFS Build 上失败

    当我尝试使用 TFS 和 Git 进行构建时 存在一个限制 即 TFS 的 git 提供程序尚不支持子模块 有点痛苦 但到底是什么 我可以告诉 TFS 在编译之前运行批处理文件 我用它来调用手动 git 脚本来更新我的 超级 项目中的所有子
  • 从 GitHub 操作推送到源

    我正在努力推动origin远程 GitHub 操作 我的行动逻辑是 handle pull request review事件并按评论消息过滤 签出到 master 合并 PR 分支 运行一些检查并将其推送到origin 脚本是 if GIT
  • Phoenix 框架中的动态模型

    有没有办法在Phoenix中动态创建和使用模型 我有一个存储有关客户表的元数据的应用程序 它们设置了一些字段 列名称和类型 然后向我发送 CSV 文件以进行解析和存储 我想根据存储的元数据生成一个模型 以便我可以使用 Ecto 来管理客户端