ChatGPT解决这个技术问题 Extra ChatGPT

什么是 ORM,它是如何工作的,我应该如何使用它? [关闭]

关闭。这个问题需要更加集中。它目前不接受答案。 3年前关闭。锁定。这个问题及其答案被锁定,因为这个问题离题但具有历史意义。它目前不接受新的答案或交互。

有人建议我将 ORM 用于我正在设计的项目,但我无法找到有关它是什么或它如何工作的信息。

谁能给我简要解释一下什么是 ORM,它是如何工作的,以及我应该如何开始使用它?

我发现了这个问题,但它是从 2009 年开始的,我不知道你是否已经掌握了 ORM,但在 CodePlex C#(entityframework.codeplex.com) 中寻找实体框架这是你可以学习的源代码。你也可以阅读这个。 (dbtechnet.org/labs/dae_lab/Orm.pdf)
只想指出 ORM cam 也与 Object-Role Modeling en.wikipedia.org/wiki/Object-role_modeling有关
这是一个有用的问题,最高答案的投票似乎证实了这一点。对什么是 ORM 的简要描述不需要意见。仅仅因为用户要求链接以开始该问题就被标记为离题。我觉得这是版主频繁的过度反应。
@NeilG 一个封闭的问题意味着这个问题是题外话。答案中可能有有用的信息,但这并不能使问题成为主题。此外,它不会被删除,它会保留在这里,但我们仍然需要保持 SO 的清洁和主题,以便它发挥最佳功能。所以,回答你的第一条评论:这不是一个有用的问题,有有用的答案。
@NeilG问题是问题包括对资源的请求(在标题和问题中)。这样的请求是题外话,主要是因为它导致人们只是发布他们最喜欢的资源的链接,就像这里的几个答案一样。从问题中删除对资源的请求将使某些现有答案无效。作为普通用户,我们不允许编辑问题以使答案无效。因此,它应该被关闭。如果问题没有得到解答,则可以对其进行编辑以删除这些请求并保持打开状态。

J
Jens

介绍

Object-Relational Mapping (ORM) 是一种技术,可让您使用面向对象的范例从数据库中查询和操作数据。在谈论 ORM 时,大多数人指的是实现对象关系映射技术的,因此有“一个 ORM”这个短语。

ORM 库是用您选择的语言编写的完全普通的库,它封装了操作数据所需的代码,因此您不再使用 SQL;您可以使用与您使用的语言相同的语言直接与对象进行交互。

例如,这是一个完全虚构的使用伪语言的案例:

你有一个书类,你想检索作者是“Linus”的所有书。手动,你会做这样的事情:

book_list = new List();
sql = "SELECT book FROM library WHERE author = 'Linus'";
data = query(sql); // I over simplify ...
while (row = data.next())
{
     book = new Book();
     book.setAuthor(row.get('author');
     book_list.add(book);
}

使用 ORM 库,它看起来像这样:

book_list = BookTable.query(author="Linus");

机械部分通过 ORM 库自动处理。

优点和缺点

使用 ORM 可以节省大量时间,因为:

DRY:您只在一个地方编写数据模型,并且更容易更新、维护和重用代码。

从数据库处理到 I18N,很多事情都是自动完成的。

它迫使您编写 MVC 代码,最终使您的代码更简洁。

您不必编写格式不正确的 SQL(大多数 Web 程序员真的很讨厌它,因为 SQL 被视为一种“子”语言,而实际上它是一种非常强大和复杂的语言)。

消毒;使用准备好的语句或事务就像调用方法一样简单。

使用 ORM 库更灵活,因为:

它符合您自然的编码方式(这是您的语言!)。

它抽象了数据库系统,因此您可以随时更改它。

该模型与应用程序的其余部分弱绑定,因此您可以更改它或在其他任何地方使用它。

它使您可以使用像数据继承这样的 OOP 优点而不会头疼。

但是 ORM 可能会很痛苦:

你必须学习它,而且 ORM 库不是轻量级的工具;

你必须设置它。同样的问题。

对于通常的查询,性能还可以,但是对于大型项目,SQL 大师总是会用他自己的 SQL 做得更好。

它抽象了数据库。虽然如果你知道幕后发生的事情是可以的,但对于可以编写非常贪婪的语句的新程序员来说,这是一个陷阱,就像 for 循环中的重击一样。

如何学习ORM?

嗯,用一个。无论您选择哪个 ORM 库,它们都使用相同的原则。这里有很多 ORM 库:

Java:休眠。

PHP:Propel 或 Doctrine(我更喜欢最后一个)。

Python:Django ORM 或 SQLAlchemy(我最喜欢的 ORM 库)。

C#:NHibernate 或实体框架

如果您想在 Web 编程中尝试使用 ORM 库,最好使用整个框架堆栈,例如:

Symfony(PHP,使用 Propel 或 Doctrine)。

Django(Python,使用内部 ORM)。

不要尝试编写自己的 ORM,除非您想学习一些东西。这是一项巨大的工作,旧的需要花费大量时间和工作才能变得可靠。


p
pkshultz

谁能给我一个简单的解释...

当然。

ORM 代表“对象到关系映射”,其中

Object 部分是您在编程语言中使用的部分(在本例中为 python)

关系部分是关系数据库管理系统(即数据库)还有其他类型的数据库,但最流行的是关系(您知道表、列、pk fk 等,例如 Oracle MySQL、MS-SQL)

最后,映射部分是您在对象和表之间建立桥梁的地方。

在不使用 ORM 框架的应用程序中,您可以手动执行此操作。使用 ORM 框架可以让您减少创建解决方案所需的样板。

所以假设你有这个对象。

 class Employee:
      def __init__( self, name ): 
          self.__name = name

       def getName( self ):
           return self.__name

       #etc.

和桌子

   create table employee(
          name varcar(10),
          -- etc  
    )

使用 ORM 框架将允许您自动将该对象与 db 记录映射并编写如下内容:

   emp = Employee("Ryan")

   orm.save( emp )

并让员工插入数据库。

哎呀,这不是那么简短,但我希望它足够简单,可以捕捉到您阅读的其他文章。


J
Justin Niessner

ORM(对象关系映射器)是一个软件/层,可帮助将代码对象映射到数据库。

有些处理的方面比其他的多……但目的是减轻开发人员肩上数据层的一些负担。

这是 Martin Fowler(数据映射器)的简短剪辑:

Patterns of Enterprise Application Architecture Data Mappers


A
Alex Martelli

像所有首字母缩略词一样,它是模棱两可的,但我认为它们的意思是 object-relational mapper - 一种遮住眼睛并让人相信下面没有 SQL 的方式,而是所有对象;-)。当然,这不是真的,也不是没有问题——总是丰富多彩的 Jeff Atwood 将 ORM 描述为 the Vietnam of CS;-)。但是,如果您对 SQL 知之甚少或根本不了解 SQL,并且遇到了一个非常简单/小规模的问题,那么它们可以为您节省时间!-)


H
Hamza Riaz

对象模型涉及以下三个概念数据抽象封装继承关系模型使用关系或表的基本概念。对象关系映射(OR 映射)产品将对象编程语言功能与关系数据库集成在一起。