当前位置:首页 >> IT
IT

Golang 之前的 ORM 编程杂谈

2025-10-31 12:18

D 合规性。在日常事务内都拒绝执行的 SQL 配置是离子的、一致的、隔绝的和长久的。规范转化变成往往是通过恰当的建筑设计来意味着的,黄金标准化是第三较长时间或 Boyce-Codd 都是。

(一些)差异

这些是无论如何无论如何不尽相同的系统可能会。他们的一些差别纸制括:

普通人对聚合静止状态有意义,而间的关系企图将其分割变成多个同上。普通人全球性内都的样本可变性情况为中心并发系统可能会内都的差点覆盖情况,并通过PVC展开保护。间的关系全球性内都的可变性需交易来保证静止状态发生变化时的有效性。在样本被长久转化变成以前,不实在需在发生变化普通人静止状态时取得有效性。普遍存在普通人交集以意味着区域性这些普通人的行径,而普遍存在间的关系交集以建立关于全球性的显然。原理论情况

请注意是由这些差异引来的情况年同上。

拓扑情况。由于请注意情况,运主要用途任何拓扑机都很难将同上拓扑到普通人:

普通人间的关系将通过将一个普通人与另一个普通人组合来透露。但是,就其普通人依赖JOIN于 SQL 内都的隐式配置,否则就其普通人将不不想被样本初始转化变成。间的关系发用意内都的多对多同上涉及 3 个同上:两个样本源和第三个通往同上。然而,这种间的关系只需两个普通人以及另一个普通人的年同上。如果您的Java默许传给,那么以这种形式对普通人建模有可能很诱人,但在线内都没有人 IS-A 一般来问道的间的关系。

谁/什么持有架构界定?Java,以及系统建筑设计程序开发建筑设计人员,还是在线的 DDL,以及 DBA?即使您在其组织内都没有人完全一致这些剧中,您无论如何可能会察觉到这个情况,即只不过的“O”受制于“R”,举例来问道。

元样本去哪儿了?大多数标识符其本质可能会有 1:1 的完全一致间的关系。例如,幂、布尔取值等将在在线和您的Java内都具备众所周知的一般来问道。但是枚举呢?很有可能这些是具有依赖于比例默认的URL或幂,并且在线和Java都可以强制拒绝执行约束。那么你把这些元样本放在哪内都呢?系统建筑设计程序?在线?两个都?

所有这些情况都需通过将一方(普通人或间的关系)同上示遗憾为正当性来补救。这引致了 ORM 的界定——它对这个正当性有什么见解?普通人还是间的关系?

解释和界定 ORM

实质上,您不能简单地“退借助于”并逃避情况。这篇社论的标题看似营销用意。毕竟,您不不想将普通人长久保存到四边形档案内都并将其称为“在线”,也不不想运主要用途 SQL 紧密结合系统建筑设计程序。这些什么事必须在某个时候相遇。但我指借助于,许多 ORM 转用的常用原理是依赖于的,主要是借助于于简便,往往以牺牲一方为代价。

从仅指上讲借助于,有两种一般来问道的 ORM:解释器这两项和在线这两项。

在解释器这两项原理内都,您将普通人数学原理界定界定为将拓扑到在线实体(一个或多个同上)的类或一般来问道。这种原理即时转换变成 SQL 并大量运主要用途入射。Go 社区内都的一个都是是gorm。在线这两项原理往往依赖于从您的在线界定第二语言 (DDL) 转换变成普通人界定解释器。Golang 解释器是SQLBoiler。

您则可能会对其内都之一激发直觉和事物的化学反应。这种见解可以盲目地持有。就其所而言,我总是这两项重新考虑普通人而不是间的关系,并运主要用途解释器这两项的 ORM。但终于我将意念发生变化为这两项重新考虑在线。该决定通过转换变成主要用途与在线交互的解释器,促使将 ORM 全部遗弃。

我们舍弃 ORM 的旅途

以上几点都是理论上的。我们的旅途从我们从 ORM Gorm 开始感受到的实际伤痛和情况开始。

情况 1:PVC的 API

来得新在线内都的一些纪录是一个后期的脸面天都。拒绝执行此配置的 SQL 是:

UPDATE SET WHERE

但是 Gorm API 发生变化了接受取值和有条件的顺序。

// 预计db.Model().Where().Updates()// 来得新整个同上,无关有条件db.Model().Updates().Where()

我们经历了一个漫长的步骤,即犯有错可能会导致灾难性的原因。ORM 的 API 是可链接的,但它比较无论如何是氮气的。某些同上示遗憾打算暂定,纸制括来得新。如果您颠倒顺序,来得新将系统建筑设计,但 Where 有条件不颁布,这显然您已来得新数学原理内都的所有请注意内容。

以前你可以辩解问道 SQL 有这种倒退,而 ORM 只是对 API 的只不过含义展开了来得正。你可以问道我们的他的团队不该来得不实在可能。或者 API 可以有来得多的文档纪录。无论争论如何,结果都是一样的:我们共度了最糟的一天。来得广为的见解是:ORM 实质上是 SQL 的剪裁机。

在我职业生涯的后期,一位二期工程经理告诉我要对剪裁机持可疑态度,因为它们只可能会给岗位量减小层面负担。我质问问道,根据合乎语义的得借助于结论,他可能会用汇编编撰所有解释器。两个极侧都不正确:简约是关于意味着最大限度的行径。但随着我职业生涯的蓬勃发展,我将 ORM 置于但可能会的剪裁阵营内都。为什么我们要妥善处理一个与完全所有开发建筑设计人员都接受过实习的超级保持稳定和众所周知的 ANSI SQL API 比如问道的计算机系统可能会?每个开发建筑设计人员都其实如何运主要用途 SQL 来得新同上内都的纪录(或者可以轻松地通过 Google 搜索),并且在借助于有错时则可能会借助于现有正确。不是每个开发建筑设计者,实质上是极较少数的开发建筑设计者,都其实 Gorm 的简约。对于您运主要用途的任何 ORM,(在新员工内都)也是如此;您将不断地在格式化的关键因素特殊任务之外实习人员。

情况2:效率和过多的CPU能用

我们的后侧在CPU容量依赖于的无链接格式化 (AWS Fargate) 上运营。随着等待时间的更长,我们迫使不断减小解释器的CPU容量,终于达到最大取值,然后看着我们的容机被害。随着样本量的放缓,我们碰到容机的比例以某种标量形式放缓。人们可能会期盼后侧改作亚标量扩大。

ORM 是一个其本质的罪魁祸首:很很难窥见许多 ORM 将运主要用途普通人诉问道来紧密结合 SQL 句子、水合结果或两者兼而有之。Gorm 的CPU征用是极侧的,但感到遗憾的是比较较少见。Bridge 在后侧运主要用途 Python 开始,我们运主要用途 Django 的 ORM 与普遍存在近似于情况的在线展开交互。

直到我们终于将其从格式化内都移除以给我们一个比起点时,我们才意识到情况的严重持续性。简略的资讯就其联在下一节内都,但作为预览:我们将拒绝执行效率提升了约 2 倍,并将CPU征用减较少了近 10 倍。

情况 3:解释我们的 I/O 配有档案

随着等待时间的更长,我们说明了自己运主要用途在线记事机器来解释我们自己的用例,并指借助于这是不匹配的。我们在 AWS 上设置了RDS Performance Insights并pganalyze来定位在线内都的停滞。这些机器很早就说明了它们的价取值,我们终于运主要用途它们来解释我们与在线交互的形式。我们否过份赚取列?我们否打算运营仍未引文的转发?

当然,这些情况都有推断的、明确的答案。显然上,我们需一个结构上机器来阐明这个情况,这是解释器内都一个明显的形态缺失。对我来问道,潜在的情况是 ORM 让与在线的交互越来越实在很难了。解释器没有人集内都或模块转化变成到解释器努内都的计算机系统可能会层。比如问道,它基本上都被那不勒斯鸡蛋转化变成了。解释我们的在线交互性需对与的业务语义有关的请注意内容展开广为的解释器监管和审批,而不是读写。

备择计划

运主要用途 ORM 的替代计划只不过比较依赖于:运主要用途常常在线涡轮机程序,在运营时紧密结合 SQL 转发,然后自己将结果拓扑回普通人。当然,ORM 以自动转化变成的形式完变成所有这些什么事,因此放这条本线将对可维护性这两项庞大牺牲。我们的他的团队得借助于得借助于结论(比较很难且没有人实在多执行者),无论这内都有什么坏处,变成本高都实在较少了,不会重新考虑。

然而,还有第三条本线:运主要用途解释器转换变成机来自动转化变成这些必需。我们将 Go 社区内都的重大项目分变成两条线:

在运营时转换变成解释器的 SQL(例如:squirrel)在编译时转换变成系统建筑设计程序解释器(解释器:jet,sqlc)

转换变成 SQL 解释器是一个有意思的意念,与转换变成系统建筑设计程序解释器相比,它需来得较少的机器和敦促。然而,我们指借助于这将是我们解释器可维护性的交叉静止。SQL 转换变成将需URL插取值,这显然在系统建筑设计在线移入时审批解释器,这是我们期盼结束的一个轻工业且耗费心力的步骤。

小孩在洗澡水内都?

我们不想了很久,就让要不要把小孩和洗澡水四人丢弃。不太可能情况不在于 ORM 本身,而在于解释器这两项子集。在 Go 社区内都, sqlboiler是一个有意思的重大项目,它从您的 DDL 转换变成数学原理界定。

我们决定不运主要用途这个重大项目,有可能如下:

有实在多的解释器转换变成这样的什么事。转换变成的解释器需灵活的配有来控制输借助于,这是一条好放的路。一总体,您不期盼中介解释器以展开配有,并在解释器努内都放有大量的 yaml 或 toml 档案,这些档案需自己的举例来说维护情况。在另一个极侧,如果您希望控制或图标配有内都仍都于的转换变成解释器的某些请注意内容,那么您就不放运了。Sqlboiler 不大持续性上受到 Active Record 的启发,我们心内都它实在简约了在线。我们企图拥抱在线,因为从文转化变成上讲借助于,我们是一个以样本为的内都心的其组织,期盼我们的在线在我们的系统建筑设计程序和 API 内都来得加乳白色。必需解释器转换变成机

我们得借助于得借助于结论研究了两个解释器转换变成机:jet和sqlc,终于必需了 sqlc。运主要用途 jet,您可以在系统建筑设计程序内都将 SQL 作为 DSL 编撰。但因为它转换变成解释器,所以它比 squirrel 等运营时 SQL 转换变成机备有的基本功能来得进一步。数学原理和标识符是一流的可引用一般来问道,而不是需URL插取值,这能避免了当您希望展开来得改时需在监管步骤内都通过解释器展开 grep。

来得吸纳人的是,它备有了一种在在线内都聚合或反规范转化变成样本的原理。ORM 的最终目标是使间的关系二叉树越来越很难,而 Jet 的最终目标是在明晰且一般来问道很好的形态内都备有样本纸制,不实在可能地宣传其内都的能用请注意内容。这是一个都是:

stmt := SELECT( Actor.ActorID, Actor.FirstName, Actor.LastName, Actor.LastUpdate, Film.AllColumns, Language.AllColumns, Category.AllColumns, ).FROM( Actor.INNER_JOIN (FilmActor, Actor.ActorID.EQ(FilmActor .ActorID)). INNER_JOIN(Film, Film.FilmID.EQ(FilmActor.FilmID)). INNER_JOIN(Language, Language.LanguageID.EQ(Film.LanguageID)). INNER_JOIN(FilmCategory, FilmCategory.FilmID.EQ(Film.FilmID) )). INNER_JOIN(Category, Category.CategoryID.EQ(FilmCategory.CategoryID)), ).WHERE( Language.Name.EQ(String("English")). AND(Category.Name.NOT_EQ(String("Action" ))). AND(Film.Length.GT(Int(180))),).ORDER_BY( Actor.ActorID.ASC(), Film.FilmID.ASC(), )var dest []struct { model.Actor 片子 []struct { model.Film 第二语言数学原理.第二语言 各种类型 []model.Category } }// 拒绝执行转发并加载结果err = stmt.Query(db, Maxdest)

这内都有很多样本聚合。打算建立的系统建筑设计程序侧数学原理是一个女演员,其内都就其联他们策划过的所有片子、片子所运主要用途的第二语言以及其所属的各种类型。

我们本来被这个建筑设计所吸纳,但在更进一步了一下之后感受不实在对劲。在这个都是内都,转发在系统建筑设计程序内都涡轮机样本数学原理,而不是比如问道,我们激怒这种原理可能会引致大量遗弃的聚合数学原理。我们的最终目标是推广具备大量的业务语义和可变性的可委以重任数学原理,这些数学原理在其一般来问道的原理内都猎取。

此外,我们的偏好是将 SQL 无论如何从解释器内都移借助于。这内都的情况是任何开发建筑设计人员都可以才行地转发在线。虽然这是本来的劳动生产率胜利,但其代价是解释器和运营时效率的长年可维护性。如果开发建筑设计人员在不运主要用途引文的意味著以次优形式转发在线怎么办?随着样本数学原理越来越来得大和简单,这种几率颇高,因为它是从 SQL 内都移除的一个必需。虽然 DSL 很受欢迎,但我们无论如何心内都它终于像剪裁机一样。

答案:sqlc

我们决定运主要用途sqlc,一个可配有的可选 sql 编译机。这种原理引来了我们的激发共鸣;我们最喜欢它不不想转换变成您不需的刚才,并且转换变成的解释器可以根据我们界定的一般来问道和首页展开内置。它使解释器感受像我们的,同时备有了移入我们意味著意味着的明显同方向。我将在以后的社论内都简略问道明我们如何让 sqlc 为我们岗位。

移除 ORM 的坏处

这个重大项目是一项漫长的特殊任务,不仅需我们的开发建筑设计人员,还需我们的产品他的团队和整个该公司的敦促。我们察觉到了基本功能终止、将 ORM 与转换变成的解释器适配运营的情况,并且必须得借助于得借助于结论总体规划我们的移入和部署同方向。所有这真的在杂货店天然资源依赖于的小型(但不断蓬勃发展的)该公司的着重下展开的。有了所有这些变成本高,支借助于很好是显着的,而且不实在可能如此。其内都,我们在后侧运营时意味着了来得多的效率和不太可能,来得多的解释器努可维护性,来得较少依赖在线记事来解释我们的样本 I/O 配有档案,来得碧原生的意味着和后侧样本数学原理的乳白色化我们所有的开发建筑设计人员,无论他们每天否接近格式化内都的在线。

效率和为数

如果您的 ORM 是高效率的,没有人运主要用途转换变成的解释器或运主要用途泛型一般来问道或API,那么它有可能在幕后展开了某种持续性的入射。在我们的都是内都,Gorm 大量运主要用途入射,因为 Go 不默许泛型,而且 Gorm 没有人界定很多API,除了决定您同上示遗憾完全一致于系统建筑设计程序数学原理的同上名。因此,我们期望在这内都取得庞大的支借助于,但是当我们开始对我们的系统可能会展开基准测试时,我们就让地观感深刻。

效率是关于意味着低运营时拒绝执行。我们通过定位后侧内都十分相似的各种岗位阻抗来对结果展开基准测试,这有可能是因为 API 打算拒绝执行它们,也有可能是由于脱机或命令行数据流引致了对在线的大量 I/O。在下图内都,我们在横轴上有用例;蓝色透露我们的 sqlc 涡轮机的样本交互层,紫色透露我们意味著运主要用途 Gorm ORM 的延期。越多低越多好。

在没有人 ORM 的意味著,运营时效率提升了 52%

在我们的岗位阻抗内都,我们打算更有大约 2 倍的拒绝执行效率来得快。令人就让的是,当岗位阻抗赚取来得多样本时,这个十进制往往可能会来得高。

不太可能是常指能用尽有可能较少的CPU,这对我们来问道尤其极为重要,因为我们在无链接后侧 (AWS Fargate) 上运营所有岗位阻抗,因此我们来得适合交叉扩大而不是顶侧扩大。我们在每个解释器上运主要用途的CPU越多较少,显然需APP的解释器就越多较少才能达到结果,这显然变成本高来得低,整体而言运主要用途率来得高。换句话问道,如果您需的解释器比例是意味著运主要用途比例的一半(预算内),您不该尽有可能妥善处理翻倍的样本量,而无需与您的 CFO 问候。

没有人 ORM 的CPU能用减较少了 78%

我们平均减较少了 78% 的CPU能用。以前你则可能会辩解问道,不太可能 Gorm 在这内都来作的什么事效率实在低了,而其他 ORM 则可能会来得多,但无论如何问道,大多数拓扑机都需一般来问道诉问道,这将引致最糟的CPU配有档案。

或多或较少革新都是由每个配置需愈演愈烈的重新分配比例减较少涡轮机的,我们不实在可能将其基准为另一个 80% 的减较少:

在没有人 ORM 的意味著,每个配置的重新分配量减较少了 80%

解释器可维护性

我指借助于所有与样本层交互的解释器都是计算机系统可能会。当然,如果您运主要用途的是 ORM,您有可能没有人将这个计算机系统可能会显式地批量到一个纸制或举例来说标量内都,我指借助于这可能会让您的情况越来越来得糟:计算机系统可能会无论如何普遍存在,但它不是孤立的。比如问道,在线交互性在整个解释器努内都被那不勒斯鸡蛋转化变成了。

当我们希望检索、来得新、创建或移除样本时,我们可能会呼叫为我们拒绝执行此配置的标量:

q.GetAccounts(ctx, ids)// 来得简单的转发转用转换变成的 Params 一般来问道q.GetAccountsPage(ctx, db.GetAccountsPageParams{...})

我们的侧点甚至不这样来作;他们通过呼叫API简约借助于内容:

结果,有正确:= fetch.Page(ctx, fetch.PageParams{ Fetcher: accounts.Fetcher{}, ... })解释我们的样本 I/O 配有档案

当您持有 ORM 时,您打算邀请其组织内都的所有编程建筑设计人员以有可能不会解释的形式访问期间在线。尽管尽最大努力实习您的他的团队解释哪些引文能用或设置 DBA 剧中,但终于您将持有不会在没有人解释器审批的意味著解释的在线交互解释器。这不可能避免地引致人们改向在线记事和管控补救计划,以解释如何访问期间在线。这些机器对于任何审批运营时效率和意味着 SLA 的流程都是受欢迎的多余,但如果您运主要用途它们来解释如何访问期间您的在线,那就没法了。

我们无论如何运主要用途RDS Performance Insights和pganalyze等机器,但我们不日后依赖它们来解释一般配有档案,或者激怒我们否打算运主要用途引文。这项岗位已重新重新分配到我们的集内都加载努,它充当我们所有在线 I/O 的计算机系统可能会,我们亦称为样本加载努。

它不是没有人数据流,但以前它是一个行政当局数据流。当系统建筑设计程序开发建筑设计人员需一个新转发时,她需在样本仓努内都打开一个 PR,该 PR 将附有解释器审批,人们可以在其内都问起否打算运主要用途引文或日常事务。诚然,这样的解释器审批标准化不该适主要用途所有加载努,但在线 I/O 将只是下游系统建筑设计程序内都的一个应将。我们的样本仓努只非议一件事,而且只非议一件事:行政当局在线交互。此外,几天后展开解释器监管也很很难。DDL 和 SQL 转发都是中间的,因此很很难其实转发否正确地运主要用途了引文。

来得多碧原生意味着

您的内都程则可能会有所无论如何不尽相同,但我们运主要用途的两个 ORM(Gorm 和 Django)都剪裁了在线通往,引致了两个情况。首先,在这两种意味著,剪裁普通人渗透到的基本功能都较少于底层涡轮机程序内都能用的基本功能。随着在线和涡轮机程序来得新以满足特定需求,这则可能会越来越比较令人郁闷。

其次,同样是在 Django 的意味著,它让我们身处了碧原生建筑设计。我们同样努力的一个总体是从我们的 Lambda 标量内都访问期间样本。诸如 Lambda 之类的标量即服务网络服务将期盼您将在线通往界定为解释器,以便它是可终止的。这个特殊任务在 Django 上都是是不有可能的。尽管我们在 Gorm 内都补救这个情况的麻烦较较少,但我们在取得我们希望的通往池特性总体察觉到了其他情况,即使在碧内都长年普遍存在的计算层上也是如此。

终于能否意味着碧原生建筑设计取决于您必需的在线涡轮机程序,并且您需确保您的 ORM 默许该涡轮机程序。我们很但他却运主要用途了 Postgres,来得但他却的是 Go 社区有专门的涡轮机程序:jackc/pgx。尽有可能在没有人 ORM 的意味著从外部运主要用途此涡轮机程序,使我们在碧原生建筑设计总体具备来得大的机动性,并尽有可能利用 Postgres 特定的基本功能,这些基本功能往往被其他这两项重新考虑广为的区域性在线默许的涡轮机程序所略去。

样本数学原理乳白色化

最后,不太可能是极为极为重要的一点,舍弃我们的 ORM 通过提升样本数学原理的乳白色化发生变化了我们的二期工程文转化变成,使其来得加以样本为的内都心。Bridge 是杂货店样本妥善处理该公司。我们为注册投资额任职期间、大型企业和其他保险业科技网络服务来作标准化转化变成和丰富保险业样本的岗位。

我们赞许样本的明晰性、精准度和不太可能以意味着这些最终目标,除非每其所都指借助于他们解释样本数学原理,否则我们不会毕竟这一点。许多 ORM 在哲学上是为中心在开发建筑设计步骤内都像是或简约在线而紧密结合的,这终于将引致您的他的团队深厚非议“O”并降低“R”的这两项级。并且“O”被锁定在单个加载努内都,任何一其所都有可能其实也有可能不其实。但是每其所都可以解释在线的形态为了让:其组织变成形式而、DDL、E/R 图等。

对我们来问道,我们的在线不太可能是我们读取和复制到的的资讯容机。这是我们思不想的同上达;我们如何简转化变成和仿真大型企业终究的简单性。移除 ORM 将所有这些内容置于人们脑海内都的前侧的内都心,不想象了对样本数学原理和 Postgres 的来得多使用权,减较少了“越多界”的盲目。这不太可能是很好的收获。

天津哪个医院做人流好
四川男科专科医院哪里好
深圳妇科专科医院
广东妇科医院哪家最好
贵阳生殖感染治疗费用
心动过速
新冠最新研究提示:国产抗病毒药物或将开启“组合治疗”新方向
排行榜
外科
慢性支气管炎长期咳嗽怎么办?

上一篇: 老鸭肉煲汤的功效和佳肴做法

下一篇: *ST数知:北京天蝎座资产管理有限公司于2月24日初步我司

相关阅读
东亚运动员包揽奥运领奖台,但这迟到了十年

当地间隔时间21日,举重诚信委员会(欧足联旗下独立核查机构)发行公告指,2012年爱丁堡悉尼奥运会会男子20公里骑行季军、格鲁吉亚参赛选手三叶莲娜·布兰德驼克隆“因违规服用兴奋剂被终止总分”。目

许家印:大干三个月,实现恒驰5量产!中国恒大也有紧接著消息

3年初22日晚9点,中国中超召开全球债务人电话可能会议,中国中超可执行总裁艾伦、非可执行总裁梁山谷以及中国中超风险化解副主任可能会副主任王文参可能会。与可能会者,王文坚称,在广大债务人的解读和默

友情链接