【问题标题】:How to pre-populate database on a Phoenix application start-up?如何在 Phoenix 应用程序启动时预填充数据库?
【发布时间】:2015-09-16 10:50:16
【问题描述】:

我有这个架构:

schema "editables" do
    field :title, :string 
    field :content, :binary
   timestamps
end

我希望在应用程序启动时自动创建并填充几行,比如我想创建 6 个条目,其中 :title 字段包含:page1、page2、... 我应该这样做吗?

【问题讨论】:

  • 您想在每次应用程序启动时插入这些?这个有点味道。
  • 是的。一旦应用程序启动。在生产中,这应该不是问题。我的目标是为用户提供 HTML 版本。如果有几个预定义字段可供用户使用 HTML content editable 进行编辑,但被硬编码为 HTML,那就太好了。这有什么奇怪的吗?
  • 在创建editable 时,您不能在表单中设置一个初始值吗?
  • 不,因为我的目标不是使用表单(而是使用 ajax),以便用户可以编辑硬编码的 HTML(我需要已经设置了 Ids/其他键,以便他们可以编辑这些字段)。

标签: elixir phoenix-framework ecto


【解决方案1】:

我的建议:创建一个将填充数据库的脚本文件。我们就叫它priv/repo/seeds.exs

alias MyApp.Repo
Repo.insert! %MyApp.Data{...}
Repo.insert! %MyApp.Data{...}

在开发中你可以运行它

mix run priv/repo/seeds.exs

或者当你在生产中需要时:

MIX_ENV=prod mix run priv/repo/seeds.exs

我看不出有什么理由让您每次启动应用时都这样做。想象一下,您在开发、测试或生产中运行的每个命令现在都需要为在数据库中创建数据而付出代价。这不是一个好主意。

【讨论】:

  • 好的,所以您的建议是制作一个脚本,只要我想填充数据库而不是将项目中的代码放在 lib(或其他 .ex)文件中,我就可以使用 Mix 运行该脚本,例如例子。我猜对了吗?
  • 好的,我想我明白了。我有偏见,因为来自 Meteor,我曾经在一个函数 Meteor.startup 中执行此操作,该函数在客户端或服务器启动时运行代码...感谢您抽出时间回答我。
  • 为您、Chris 和团队其他成员准备的大型 UAU。我很惊讶,因为解决方案已经在项目文件中到位(我以前从未研究过它......)并且文档非常棒,链接到定义让新手能够理解它!深表感谢。
  • 将 Exrm 用于生产版本时,需要一个不依赖于 Mix 的单独解决方案。这里描述了一种解决方案:github.com/bitwalker/exrm/issues/67#issuecomment-183457937
猜你喜欢
  • 2011-12-29
  • 1970-01-01
  • 2018-02-13
  • 2015-05-07
  • 1970-01-01
  • 1970-01-01
  • 2019-03-22
  • 1970-01-01
  • 2014-05-29
相关资源
最近更新 更多