搜索

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
安卓首家接入DeepSeek背后:看见女性力量安卓首家接入DeepSeek背后:看见女性力量Mar 12, 2025 pm 12:27 PM

中国女性科技力量在AI领域的崛起:荣耀与DeepSeek合作背后的女性故事女性在科技领域的贡献日益显着。中国科技部数据显示,女性科技工作者数量庞大,在AI算法开发中展现出独特的社会价值敏感性。本文将聚焦荣耀手机,探究其率先接入DeepSeek大模型背后的女性团队力量,展现她们如何推动科技进步,重塑科技发展价值坐标系。 2024年2月8日,荣耀正式上线DeepSeek-R1满血版大模型,成为安卓阵营首家接入DeepSeek的厂商,引发用户热烈反响。这一成功背后,女性团队成员在产品决策、技术攻坚和用户

DeepSeek'惊人”盈利:理论利润率高达545%!DeepSeek'惊人”盈利:理论利润率高达545%!Mar 12, 2025 pm 12:21 PM

DeepSeek公司在知乎发布技术文章,详细介绍了其DeepSeek-V3/R1推理系统,并首次公开关键财务数据,引发业界关注。文章显示,该系统单日成本利润率高达545%,创下全球AI大模型盈利新高。DeepSeek的低成本策略使其在市场竞争中占据优势。其模型训练成本仅为同类产品的1%-5%,V3模型训练成本仅为557.6万美元,远低于竞争对手。同时,R1的API定价仅为OpenAIo3-mini的1/7至1/2。这些数据证明了DeepSeek技术路线的商业可行性,也为AI大模型的高效盈利树立了

2025年最佳10个最佳免费反向链接检查器工具2025年最佳10个最佳免费反向链接检查器工具Mar 21, 2025 am 08:28 AM

网站建设只是第一步:SEO与反向链接的重要性 建立网站只是将其转化为宝贵营销资产的第一步。您需要进行SEO优化,以提高网站在搜索引擎中的可见度,吸引潜在客户。反向链接是提升网站排名的关键,它向谷歌和其他搜索引擎表明您的网站权威性和可信度。 并非所有反向链接都有利:识别并避免有害链接 并非所有反向链接都有益。有害链接会损害您的排名。优秀的免费反向链接检查工具可以监控链接到您网站的来源,并提醒您注意有害链接。此外,您还可以分析竞争对手的链接策略,从中学习借鉴。 免费反向链接检查工具:您的SEO情报员

美的推出首款DeepSeek空调:AI语音交互 可实现40万 条指令!美的推出首款DeepSeek空调:AI语音交互 可实现40万 条指令!Mar 12, 2025 pm 12:18 PM

美的即将发布搭载DeepSeek大模型的首款空调——美的鲜净感空气机T6,发布会定于3月1日下午1点30分举行。这款空调配备先进的空气智驾系统,可根据环境智能调节温度、湿度和风速等参数。更重要的是,它集成了DeepSeek大模型,支持超过40万条AI语音指令。美的此举引发业界热议,尤其关注白电产品与大模型结合的意义。不同于传统空调简单的温度设定,美的鲜净感空气机T6能够理解更复杂、更模糊的指令,并根据家庭环境智能调节湿度等,显着提升用户体验。

百度又一国民产品接入DeepSeek,是想开了还是跟风?百度又一国民产品接入DeepSeek,是想开了还是跟风?Mar 12, 2025 pm 01:48 PM

DeepSeek-R1赋能百度文库与网盘:深度思考与行动的完美融合短短一个月内,DeepSeek-R1已迅速融入众多平台。百度凭借大胆的战略布局,将DeepSeek作为第三方模型伙伴,整合进自身生态系统,这标志着其“大模型 搜索”生态战略的重大进展。百度搜索和文心智能体平台率先接入DeepSeek及文心大模型的深度搜索功能,为用户提供免费的AI搜索体验。同时,“百度一下,你就知道”的经典slogan回归,新版百度APP也整合了文心大模型和DeepSeek的能力,推出“AI搜索”、“全网信息提炼”

使用GO构建网络漏洞扫描仪使用GO构建网络漏洞扫描仪Apr 01, 2025 am 08:27 AM

此基于GO的网络漏洞扫描仪有效地确定了潜在的安全弱点。 它利用了GO的并发功能的速度功能,包括服务检测和漏洞匹配。让我们探索它的能力和道德

及时的网络开发工程及时的网络开发工程Mar 09, 2025 am 08:27 AM

AI及时工程代码生成:开发人员指南 代码开发的景观有望进行重大转变。 掌握大型语言模型(LLM)和及时工程对于未来几年对开发人员至关重要。 Th

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
2 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前By尊渡假赌尊渡假赌尊渡假赌

热工具

EditPlus 中文破解版

EditPlus 中文破解版

体积小,语法高亮,不支持代码提示功能

VSCode Windows 64位 下载

VSCode Windows 64位 下载

微软推出的免费、功能强大的一款IDE编辑器

Dreamweaver Mac版

Dreamweaver Mac版

视觉化网页开发工具

MinGW - 适用于 Windows 的极简 GNU

MinGW - 适用于 Windows 的极简 GNU

这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )专业的PHP集成开发工具