ecto库

尊渡假赌尊渡假赌尊渡假赌
发布: 2025-02-18 09:38:10
原创
178 人浏览过

ecto库

lixir是一种现代,动态,功能性的编程语言,用于构建高度分布和容忍故障的应用程序。 ECTO是其主要库,用于使用数据库,为我们提供了与Common API下的数据库进行交互的工具,将数据库与我们的应用程序旁边的数据库进行版本,并在应用程序中处理数据处理。

>本文快速查看ECTO库的主要方面。虽然它是为ECTO 1.X编写的,但本文中的示例与ECTO 2兼容,并且在差异所在的位置,则提到了它们。假定长生不老药和混合的基本知识。

钥匙要点

> ecto是用于处理数据库操作的长生不老药中的一个强大库,为数据库交互,版本控制和数据处理提供了通用的API。
    >
  • 设置过程涉及创建一个新的混合应用程序,配置依赖项并将ECTO存储库模块集成到应用程序的监督树中以进行有效的数据库管理。
  • > ecto的迁移功能允许在应用程序代码旁边对数据库进行版本处理,从而促进更改跟踪和应用不同数据库状态的应用。
  • > ECTO模式和更改集对于定义数据结构和处理数据验证至关重要,确保仅操纵和存储有效的数据。
  • >本文演示了使用eTo构建一个简单的CRUD应用程序,说明了如何执行数据库操作,例如创建,阅读,更新和删除记录。
  • >
  • 应用程序
  • >我们将构建一个非常简单的应用程序,可以为我们存储并检索笔记。通过这样做,我们将浏览ECTO的四个主要组件中的每个组件:存储架,模式,更改和查询。
创建一个新的应用程序

让我们从生成新的混合应用程序开始:

-SUP标志生成了一些OTP应用程序所需的其他样板代码。此应用程序需要具有监督树,因为Ecto需要它(一分钟内详细介绍)。

设置依赖项

现在,让我们使用一些应用程序依赖项更新Mix.exs文件。为此,我们将要指定ECTO及其适配器之一。我选择为此使用MySQL,因此我们需要指定Mariaex库(ECTO支持许多数据库)。
mix new notex <span>--sup
</span>
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
>

>在mix.exs文件中更新应用程序/0函数,并使用以下内容:>

和更新DEPS/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>
登录后复制
登录后复制
登录后复制
登录后复制
>我们添加了Notex.Repo模块作为儿童主管(因为它本身就是一个监督OTP应用程序)。这意味着它将由我们的OTP应用程序监督,我们的应用程序将负责在应用程序启动时启动它。

使用ECTO创建的每个连接都使用单独的过程(其中使用称为Poolboy的库从过程池中拉出该过程)。这样做是为了使我们的查询可以同时执行,并且可以从故障(例如超时)中获得弹性。因此,我们的应用程序需要OTP,因为ECTO具有自己的过程需要监督的过程(包括监督树监督数据库连接池)。可以使用Erlang的Observer库可以看出这一点,这使我们能够可视化应用程序中的过程。将存储库添加到要监督的工作流程中后,我们需要最后配置适配器,以便它可以与数据库进行通信。将以下代码放在`config/config.exs`文件的末尾(根据需要更新详细信息):
mix new notex <span>--sup
</span>
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
在这里,我们指定了我们的OTP应用程序的名称(:notex)和我们刚定义的模块(notex.repo)的名称,以启用与数据库的通信。其他配置选项应该是相当自我解释的。 ECTO 2要求我们另外指定我们在应用程序中使用的ECTO存储库列表。

> 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库

>这就是为什么此应用程序需要成为OTP应用程序的原因。但这在本文中,我们将在流程和OTP方面要走的兔子洞。他们将在以后的文章中更详细地介绍。

>

创建数据库和表

现在,使用该设置,我们可以创建我们的数据库和表。要创建数据库,请运行以下命令:>

为了创建表,我们将使用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>
登录后复制
登录后复制
可以使用mix ecto.gen.gen.ger.gen.ger命令创建一个新的迁移。

>以上应在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>
登录后复制
登录后复制
登录后复制
登录后复制
这将使用3个字段创建我们的笔记表(第三个字段是ID,主要键)。>

>创建了表,现在该为表创建模型了。该模型用于定义表及其各自类型的字段。这些应用程序将在施放和验证数据时通过应用程序和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>
登录后复制
登录后复制
>仅在上面,我们就可以启动IEX并开始查询我们的数据库:>

(删除的控制台调试信息。)

> 导入

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>
登录后复制
> 使用记录时,我们使用的更改是我们使用的。它们使我们能够在插入之前跟踪对数据的更改,并验证这些更改并将其值投入正确的数据类型(根据我们的模式定义)。从上面可以看到,``to.changeset {} struct都包含许多成员,这些成员对于查看更改是否有效(canschet.valid?)很有用,如果它们不存在,则有什么错误.Errors),等等。

>让我们更新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完成的!功能,要么在成功时返回注释,要么在失败时投掷。

> 根据提供的注释ID更新注释。注意函数签名映射(ID密钥)中的字符串键。这是我从Phoenix框架中获取的一项惯例,其中不动动的数据(通常是用户供给)在带有字符串键的地图中表示,并且具有原子密钥的地图中,消毒的数据表示。要执行更新,我们首先根据数据库从数据库中检索注释,然后使用Cast/4函数将更改应用于记录,然后最终将更新的更改集插入数据库。 > delete_note/1函数从数据库中删除注释。我们首先通过其ID从数据库中获取注释(类似于Update_note/1函数),然后使用返回的Note struct删除它。

>有上述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的基础知识。

经常询问有关Elixir的Ecto库

的问题(常见问题解答)

>

> ecto如何处理数据验证?

。更改是一个数据结构,可将数据库进行更改,以及错误,验证和类型铸造信息。更改集可确保仅将有效数据保存到数据库中,从而为数据验证和错误处理提供了可靠的机制。

>

>我如何使用eTOTO执行复杂的查询?这使您可以以可读性和高效的方式编写复杂的查询。您可以使用“从关键字”启动查询,并链接其他功能,例如select,where,order_by,然后加入构建查询。 ECTO还支持子征服,聚合和其他高级SQL功能。

> ecto.schema在Ecto库中的作用是什么?数据。它将您的Elixir应用程序的数据映射到数据库表,反之亦然。使用ecto.schema,您可以定义数据的字段,它们的类型以及不同模式之间的任何关联。

ecto如何处理数据库迁移?

用于处理数据库迁移。迁移是随着时间的推移会改变数据库结构的脚本。他们可以创建或删除表,添加或删除列,创建索引等等。 ECTO的迁移功能可确保以受控和可逆的方式执行这些更改。

可以使用NOSQL数据库来工作?

,而ECTO主要是为SQL数据库设计的,它也可以与NOSQL一起使用通过使用适配器的数据库。但是,某些功能(例如迁移和复杂查询)可能无法得到完全支持,或者可能会根据所使用的特定NOSQL数据库和适配器的方式有所不同。

>

> ecto如何处理交易?和强大的API处理交易。您可以使用ecto.repo.transaction函数来启动事务,如果函数返回,则交易中所做的任何更改都将归结到数据库:确定或返回(如果返回)回滚:error。

>什么是ecto.multi? ​​ecto.multi是ECTO的功能,可让您将多个操作分组在一起。当您需要在一次交易中执行多个操作时,这很有用,并且您希望所有这些都成功或整体失败。 ecto.Multi确保数据一致性并使错误处理更加容易。

>如何将ECTO与Phoenix?

菲尼克斯(Phoenix)一起使用,这是流行的elixir的Web框架,与ECTO无缝集成。 Phoenix使用ECTO来满足其所有数据操作需求,并提供使创建ECTO模式,更改集和迁移的生成器。您还可以在凤凰控制器和视图中直接使用eTo的查询API。

我如何了解有关ecto的更多信息?

>官方的ecto文档是一个很好的资源,可以了解更多有关eTecto的信息。它为ECTO的所有功能以及示例和最佳实践提供了全面的指南。您还可以在线找到许多详细介绍ECTO的各个方面的教程和博客文章。

以上是ecto库的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板