>本文快速查看ECTO库的主要方面。虽然它是为ECTO 1.X编写的,但本文中的示例与ECTO 2兼容,并且在差异所在的位置,则提到了它们。假定长生不老药和混合的基本知识。
钥匙要点
现在,让我们使用一些应用程序依赖项更新Mix.exs文件。为此,我们将要指定ECTO及其适配器之一。我选择为此使用MySQL,因此我们需要指定Mariaex库(ECTO支持许多数据库)。
mix new notex <span>--sup </span>
>在mix.exs文件中更新应用程序/0函数,并使用以下内容:
现在,用混合deps.get获取依赖项。
接下来,我们需要将这些依赖项集成到我们的应用程序中。这将涉及为ECTO存储库创建一个新的包装器模块,更新应用程序的监督树以启动和监督该新模块,并配置适配器的连接信息。
让我们首先从lib/notex/repo.ex上定义一个notex.repo模块,并使用以下代码:
mix new notex <span>--sup </span>
>常规的该模块(lib/app_name/repo.ex)的位置。每当我们使用Mix ecto命令时,都会默认在AppName.Repo上查找定义的存储库。我们可以将其放置在其他地方,但这将是不便之处,即必须使用-r(或 - repo)标志来指定其位置。
>>上述notex.repo模块使我们能够使用eTeco使用数据库。它通过首先从ECTO的repo模块(提供数据库查询API)注入功能,然后通过将我们的OTP应用程序命名为:Notex。
> ecto存储库为我们提供了一个通用接口,可以与基础数据库进行交互(这是由所使用的适配器决定的)。因此,尽管Ecto使用了术语回购,但它不遵循存储库设计模式,因为它是数据库周围的包装器,而不是表格。>。
>现在我们已经定义了notex.repo模块,我们现在必须将其添加到Notex模块中的监督树(lib/notex.ex)。使用以下内容更新开始/2函数:
<span>def <span>application</span> do </span> <span>[applications: [:logger, :ecto, :mariaex], </span> <span>mod: {Notex, []}] </span><span>end </span>
使用ECTO创建的每个连接都使用单独的过程(其中使用称为Poolboy的库从过程池中拉出该过程)。这样做是为了使我们的查询可以同时执行,并且可以从故障(例如超时)中获得弹性。因此,我们的应用程序需要OTP,因为ECTO具有自己的过程需要监督的过程(包括监督树监督数据库连接池)。可以使用Erlang的Observer库可以看出这一点,这使我们能够可视化应用程序中的过程。将存储库添加到要监督的工作流程中后,我们需要最后配置适配器,以便它可以与数据库进行通信。将以下代码放在`config/config.exs`文件的末尾(根据需要更新详细信息):
mix new notex <span>--sup </span>
> ecto实际上为我们提供了一个快捷方式,用于设置上述存储库模块作为混合任务:mix ecto.gen.repo。这为我们生成了存储库模块,并使用一些基本配置更新了config.exs文件(虽然仍需要手动添加回购模块)。我避免在此处使用它,主要是出于教学原因是显示如何手动设置ECTO(这是回购生成器假设您使用Postgres的事实,因此我们必须在配置中更新适配器)。
继续前进,让我们快速了解过程层次结构。 (请注意,如果您正在运行ECTO 2,则首先需要使用Mix ecto.创建数据库。
<span>def <span>application</span> do </span> <span>[applications: [:logger, :ecto, :mariaex], </span> <span>mod: {Notex, []}] </span><span>end </span>
>
创建数据库和表为了创建表,我们将使用ECTO的迁移功能。迁移使我们能够与源代码一起版本版本,从而可以跟踪更改并应用不同的状态。因此,只要我们想更改数据库的结构。
defp deps <span>do </span> <span>[{:ecto, <span>"~> 1.1.5"</span>}, # or "~> 2.0" for Ecto 2 </span> <span>{:mariaex, <span>"~> 0.6.0"</span>}] # or "~> 0.7.0" for Ecto 2 </span><span>end </span>
>以上应在Priv/Repo/Migrations以及一个新的迁移文件中创建一个新的迁移文件夹。此文件以创建的日期和时间(用于简单目录订购)以及我们的迁移名称前缀。打开该文件并将其修改为以下内容:
mix new notex <span>--sup </span>
>保持简单,我们使用创建宏来定义一个带有两个字段的新表(称为注释):note_name和note_content。主键是为我们创建的(命名ID)。尽管我们的两个字段都被定义为简单的字符串,但ECTO支持多种类型 - 您可以在其文档中查看。
>我们的迁移完成后,我们现在可以使用以下命令运行迁移:
<span>def <span>application</span> do </span> <span>[applications: [:logger, :ecto, :mariaex], </span> <span>mod: {Notex, []}] </span><span>end </span>
>创建了表,现在该为表创建模型了。该模型用于定义表及其各自类型的字段。这些应用程序将在施放和验证数据时通过应用程序和ECTO的查询DSL使用。模型定义也可能包含虚拟字段(与迁移定义不同),这些字段通常用于持有我们不想持续存在的短暂数据(例如未经解决的密码)。
>>以其最基本的形式,我们的notex.note模型(位于lib/notex/note.ex)看起来如下:
>>我们注入ecto.schema模块,以便我们可以使用模式宏来定义字段及其类型。当我们使用ECTO的更改集时,这些定义将在稍后变得重要。模式宏对我们所做的其他事情是将类型的结构定义为当前模块(在这种情况下,是%notex.note.note {})。该结构将使我们能够创建新的更改(更快详细介绍)并将数据插入表中。
defp deps <span>do </span> <span>[{:ecto, <span>"~> 1.1.5"</span>}, # or "~> 2.0" for Ecto 2 </span> <span>{:mariaex, <span>"~> 0.6.0"</span>}] # or "~> 0.7.0" for Ecto 2 </span><span>end </span>
(删除的控制台调试信息。)
> 导入
ecto的查询模块,以使我们在Shell中使用的所有查询DSL宏(例如来自来自的)。然后,我们创建一个简单的查询以返回所有记录(使用全/1),仅选择Note_name字段。这将返回一个空列表,因为我们目前在数据库中没有记录。让我们创建一个新的更改集并将其插入表格:defmodule Notex<span>.Repo do </span> use Ecto<span>.Repo, otp_app: :notex </span><span>end </span>
(删除的控制台调试信息。)
>
我们从再次导入ecto.Query开始,这是最后一次获取操作所需的(特别是从宏中出发)。然后,我们使用从ecto.changeset的更改/1函数使用%notex.note {} struct创建一个新更改。然后插入此更改,然后检索。<span>def <span>start</span>(_type, _args) do </span> import Supervisor<span>.Spec, warn: false </span> children <span>= [ </span> supervisor<span>(Notex.Repo, []), </span> <span>] </span> opts <span>= [strategy: :one_for_one, name: Notex.Supervisor] </span> Supervisor<span>.start_link(children, opts) </span><span>end </span>
>让我们更新notex.note模型以演示某些更改和查询操作,因为在IEX中执行这些更改和查询操作有点混乱:
>mix new notex <span>--sup </span>
>让我们浏览五个新功能中的每个功能。 insert_note/1函数为我们创建了一个新注释。 CAST/4函数将数据从输入字段铸造到其各自的字段类型(根据我们的模式定义),并确保所有必需的字段都具有值。然后将从Cast/4返回的更改插入数据库中。请注意,在ECTO 2中,应使用Cast/3和Validate_required/3功能代替cast/4。
get_notes/0功能返回表中所有注释的元组列表。这是通过选择语句中的模式匹配来完成的。 (例如,我们很容易返回一个地图列表,例如:%{id:n.id,note_name:n.note_name}。)get_note/1函数根据注释ID从表中检索单个注释。这是通过Get完成的!功能,要么在成功时返回注释,要么在失败时投掷。
>>有上述CRUD操作,让我们跳回IEX并尝试一下:
(删除的控制台调试信息。)
>>我们有了它,是使用ecto的基本CRUD应用程序!我们可以渲染输出并使API更好地查询,但是我将其作为扩展名,因为这些内容与我们所涵盖的内容相切(而且本文已经足够长,我认为)。
结论<span>def <span>application</span> do </span> <span>[applications: [:logger, :ecto, :mariaex], </span> <span>mod: {Notex, []}] </span><span>end </span>
>本文通过从头开始创建一个简单的CRUD应用程序来研究ECTO的基本面。我们已经看到了许多能力ecto包来管理记录和数据库更改,包括迁移,模式及其查询DSL,以及涉及切向主题(例如OTP)。我希望这是那些希望加速使用Elixir中的数据库的人!在下一篇文章中,我介绍了Elixir的Ecto查询DSL的基础知识。
> ecto如何处理数据验证?
>
>我如何使用eTOTO执行复杂的查询?这使您可以以可读性和高效的方式编写复杂的查询。您可以使用“从关键字”启动查询,并链接其他功能,例如select,where,order_by,然后加入构建查询。 ECTO还支持子征服,聚合和其他高级SQL功能。> ecto.schema在Ecto库中的作用是什么?数据。它将您的Elixir应用程序的数据映射到数据库表,反之亦然。使用ecto.schema,您可以定义数据的字段,它们的类型以及不同模式之间的任何关联。ecto如何处理数据库迁移?
可以使用NOSQL数据库来工作?
以上是ecto库的详细内容。更多信息请关注PHP中文网其他相关文章!