ORM:代码与数据库的魔法翻译

2024-10-25

从代码到数据库,再回到代码:ORM的魔法

想象一下你正在搭建一个在线商店。 你需要存储产品、客户和订单等大量数据,并高效地管理它们。你会怎么做呢?

你可以编写复杂的 SQL 查询来每次添加新商品、检索客户信息或处理订单。 但有一个更好的方法:对象关系映射 (ORM)

ORM 跨越你的面向对象代码与关系型数据库之间的鸿沟。 它允许你使用熟悉的对象与数据交互,抽象了 SQL 的复杂性。 这使得开发过程更快、更井然有序,并且更少出错。

对象持久化:ORM 的核心

ORM 的核心功能之一是 对象持久化。 这指的是 将你的代码中的对象保存到数据库中,并在以后检索它们的 能力。 可以把它想象成一个神奇的翻译器,它将你的对象转换为数据库行,反之亦然。

让我们以我们的在线商店为例:

你的代码可能有一个代表产品的对象:

class Product:
  def __init__(self, name, price, description):
    self.name = name
    self.price = price
    self.description = description

ORM 允许你用一行代码将这个产品对象保存到数据库中,例如:

product_instance = Product("Awesome T-Shirt", 25.99, "The coolest shirt ever!")
session.add(product_instance)  # 将产品添加到数据库
session.commit()  # 永久保存更改

类似地,从数据库检索一个产品 变得简单如:

retrieved_product = session.query(Product).filter_by(name="Awesome T-Shirt").first()
print(retrieved_product.price)  # 输出: 25.99

ORM 对象持久化的优势:

  • 更简洁的代码: 专注于你的业务逻辑,而不是 SQL 语法。
  • 提高可维护性: 数据库架构的变化不太可能导致应用程序崩溃。
  • 提高生产力: 花费更少的时间编写重复查询,更多时间用于构建功能。
  • 更强的类型安全性: 在编译时强制执行数据类型,减少错误。

流行的 ORM 框架:

  • Django ORM (Python)
  • Hibernate (Java)
  • SQLAlchemy (Python)
  • Doctrine (PHP)

像这些 ORM 框架赋予开发人员通过无缝地将面向对象代码与关系型数据库集成,构建健壮且易维护 Web 应用程序的能力。

让我们假设你正在构建一个类似 Instagram 的社交媒体平台。 你需要存储有关用户、他们的帖子(包括图像和标题)、点赞、评论,甚至可能包括关注者的信息。

没有 ORM:

想象一下尝试使用原始 SQL 查询来管理所有这些数据。 每当你想创建一个新帖子时,你都必须编写一个复杂的 SQL INSERT 语句将其添加到“帖子”表中,然后更新像“用户”(跟踪他们的帖子数量)等相关表,以及潜在的“点赞”和“评论”表。 检索用户帖子信息将涉及多个查询连接不同的表,并且数据库架构中的任何更改都可能需要你重写许多 SQL 查询。

使用 ORM:

使用 Django ORM(用于 Python)这种 ORM 变得大大简化:

  • 用户对象: 你定义一个 User 类,其中包含诸如 usernamepasswordbio 等属性。 ORM 自动将这些属性映射到数据库表中的列。
  • 帖子对象: 同样地,你创建一个 Post 类,其中包含诸如 titlecontentimage_urluser(创建该帖子的用户的引用)等属性。
  • 保存数据: 要保存一个新帖子,只需实例化一个 Post 对象,设置其属性,然后使用 ORM 的 save() 方法:
new_post = Post(title="My amazing day!", content="Went hiking in the mountains.", user=current_user) 
new_post.save()  # 将帖子保存到数据库
  • 检索数据: 要获取特定用户的全部帖子,你可以使用 ORM 的查询方法:
user_posts = current_user.posts.all()  # 获取与当前登录用户相关联的所有帖子

ORM 在后台处理 SQL 的复杂性,使你能够专注于应用程序的逻辑和用户体验。

ORM 使得开发带有数据库的复杂应用程序变得更加易于管理和高效,因为它提供了一种结构化且直观的与数据交互的方式。

## ORM vs 手动 SQL
特征 ORM 手动 SQL
代码简洁性 简洁易懂,专注于业务逻辑 复杂冗长,需要熟练掌握 SQL 语法
可维护性 数据库结构更改对代码影响较小 数据库结构更改可能导致大量代码更新
生产力 更高,可以更快地开发和迭代 低,编写重复查询耗费大量时间
类型安全性 强制执行数据类型,减少错误 容易出现类型错误,需要手动检查
学习曲线 需要学习 ORM 特定的 API 和概念 需要学习 SQL 语法和数据库设计
Blog Post Image