ToB企服应用市场:ToB评测及商务社交产业平台

标题: ORM框架详解:为什么不直接写SQL? [打印本页]

作者: 魏晓东    时间: 2024-11-22 09:22
标题: ORM框架详解:为什么不直接写SQL?
想象一下,你正在开发一个小型的在线书店应用。你需要存储册本信息、用户数据和订单记录。作为一个初学者,你大概会想:“我已经学会了SQL,为什么还要利用ORM框架呢?直接写SQL语句不是更简单、更直接吗?”
假如你有雷同的疑问,那么恭喜你!你已经踏上了深入理解数据库交互的journey。在这篇文章中,我们将一起探索ORM框架的世界,相识它为什么存在,以及它怎样能够提升你的开发服从和代码质量。


  
什么是ORM框架?

ORM是"Object-Relational Mapping"的缩写,中文通常翻译为"对象关系映射"。这个术语听起来大概有点抽象,让我们通过一个简单的比喻来理解它:
想象你是一位翻译官,你的工作是在两种完全差别的语言之间进行翻译。在编程世界中,ORM就像如许一位翻译官,它在面向对象的编程语言(如Java、Python、C#等)和关系型数据库(如MySQL、PostgreSQL、Oracle等)之间进行"翻译"。
具体来说,ORM框架允许你:
通过这种映射,你可以利用认识的面向对象编程(OOP)概念和语法来进行数据库操作,而不需要直接编写SQL语句。

为什么需要ORM框架?

在答复这个问题之前,让我们先思索一下直接利用SQL大概会遇到的一些挑战:
ORM框架的出现就是为相识决这些问题。它提供了一个抽象层,使得开发者可以用面向对象的方式来操作数据库,从而提高开发服从,减少错误,并使代码更易于维护。
ORM vs 直接SQL:一个实际例子

让我们通过一个具体的例子来比较利用ORM和直接写SQL的区别。假设我们要实现earlier提到的在线书店应用中的一个功能:根据作者名称查询册本并更新代价。

直接利用SQL

  1. import mysql.connector
  2. # 连接数据库
  3. conn = mysql.connector.connect(
  4.     host="localhost",
  5.     user="yourusername",
  6.     password="yourpassword",
  7.     database="bookstore"
  8. )
  9. cursor = conn.cursor()
  10. # 查询书籍
  11. author_name = "J.K. Rowling"
  12. query = "SELECT id, title, price FROM books WHERE author = %s"
  13. cursor.execute(query, (author_name,))
  14. books = cursor.fetchall()
  15. # 更新价格
  16. for book in books:
  17.     book_id, title, current_price = book
  18.     new_price = current_price * 1.1  # 提高10%的价格
  19.     update_query = "UPDATE books SET price = %s WHERE id = %s"
  20.     cursor.execute(update_query, (new_price, book_id))
  21.     print(f"Updated price for '{title}' from {current_price} to {new_price}")
  22. # 提交事务并关闭连接
  23. conn.commit()
  24. cursor.close()
  25. conn.close()
复制代码
利用ORM(以SQLAlchemy为例)

  1. from sqlalchemy import create_engine, Column, Integer, String, Float
  2. from sqlalchemy.ext.declarative import declarative_base
  3. from sqlalchemy.orm import sessionmaker
  4. # 创建数据库引擎
  5. engine = create_engine('mysql://yourusername:yourpassword@localhost/bookstore')
  6. Base = declarative_base()
  7. # 定义Book模型
  8. class Book(Base):
  9.     __tablename__ = 'books'
  10.     id = Column(Integer, primary_key=True)
  11.     title = Column(String(100))
  12.     author = Column(String(50))
  13.     price = Column(Float)
  14. # 创建会话
  15. Session = sessionmaker(bind=engine)
  16. session = Session()
  17. # 查询和更新书籍
  18. author_name = "J.K. Rowling"
  19. books = session.query(Book).filter_by(author=author_name).all()
  20. for book in books:
  21.     book.price *= 1.1  # 提高10%的价格
  22.     print(f"Updated price for '{book.title}' from {book.price/1.1:.2f} to {book.price:.2f}")
  23. # 提交事务
  24. session.commit()
  25. session.close()
复制代码
通过比较这两段代码,我们可以看到利用ORM带来的一些显着上风:
ORM的上风


通过上面的例子,我们已经看到了ORM的一些长处。让我们更系统地总结一下ORM框架的主要上风:
ORM的潜在缺点

只管ORM框架带来了很多上风,但它也不是没有缺点。相识这些潜在的问题对于精确利用ORM非常告急:
只管存在这些潜在的缺点,但对于大多数应用步伐来说,ORM的上风仍然宏大于缺点。关键是要理解这些限制,并在适当的时候做出衡量。
常见的ORM框架

差别的编程语言通常有其盛行的ORM框架。以下是一些主流编程语言中常用的ORM框架:
每个框架都每个框架都有其独特的特性和上风,选择哪一个通常取决于你的具体需求、项目规模、以及个人或团队的偏好。
怎样选择合适的ORM框架

选择合适的ORM框架对于项目标成功至关告急。以下是一些选择ORM框架时需要思量的因素:
通过仔细衡量这些因素,你可以为你的项目选择最合适的ORM框架。记住,没有一个框架是完美的或恰当全部场景的,关键是找到最恰当你特定需求的办理方案。
实际应用:利用ORM构建在线书店后端

为了更好地理解ORM在实际项目中的应用,让我们用Python和SQLAlchemy来构建一个简单的在线书店后端。这个例子将展示怎样定义模子、实行查询、以及处理惩罚关系。
起首,我们需要安装须要的依赖:
  1. pip install sqlalchemy
复制代码
然后,我们可以开始编写我们的代码:
  1. from sqlalchemy import create_engine, Column, Integer, String, Float, ForeignKey
  2. from sqlalchemy.ext.declarative import declarative_base
  3. from sqlalchemy.orm import sessionmaker, relationship
  4. # 创建数据库引擎
  5. engine = create_engine('sqlite:///bookstore.db', echo=True)
  6. Base = declarative_base()
  7. # 定义模型
  8. class Author(Base):
  9.     __tablename__ = 'authors'
  10.     id = Column(Integer, primary_key=True)
  11.     name = Column(String(100), nullable=False)
  12.     books = relationship("Book", back_populates="author")
  13. class Book(Base):
  14.     __tablename__ = 'books'
  15.     id = Column(Integer, primary_key=True)
  16.     title = Column(String(100), nullable=False)
  17.     price = Column(Float, nullable=False)
  18.     author_id = Column(Integer, ForeignKey('authors.id'))
  19.     author = relationship("Author", back_populates="books")
  20. # 创建表
  21. Base.metadata.create_all(engine)
  22. # 创建会话
  23. Session = sessionmaker(bind=engine)
  24. session = Session()
  25. # 添加数据
  26. author1 = Author(name="J.K. Rowling")
  27. book1 = Book(title="Harry Potter and the Philosopher's Stone", price=19.99, author=author1)
  28. book2 = Book(title="Harry Potter and the Chamber of Secrets", price=21.99, author=author1)
  29. session.add(author1)
  30. session.add_all([book1, book2])
  31. session.commit()
  32. # 查询数据
  33. authors = session.query(Author).all()
  34. for author in authors:
  35.     print(f"Author: {author.name}")
  36.     for book in author.books:
  37.         print(f"  - {book.title} (${book.price:.2f})")
  38. # 更新数据
  39. book_to_update = session.query(Book).filter_by(title="Harry Potter and the Philosopher's Stone").first()
  40. if book_to_update:
  41.     book_to_update.price = 24.99
  42.     session.commit()
  43.     print(f"Updated price of '{book_to_update.title}' to ${book_to_update.price:.2f}")
  44. # 删除数据
  45. book_to_delete = session.query(Book).filter_by(title="Harry Potter and the Chamber of Secrets").first()
  46. if book_to_delete:
  47.     session.delete(book_to_delete)
  48.     session.commit()
  49.     print(f"Deleted '{book_to_delete.title}'")
  50. session.close()
复制代码
这个例子展示了怎样:
通过这个简单的例子,我们可以看到ORM怎样简化数据库操作,使得代码更加直观和面向对象。
结论

ORM框架为开发者提供了一种强盛的工具,使得数据库操作变得更加简单、直观和安全。虽然直接编写SQL在某些环境下大概更简单或更高效,但ORM带来的利益通常超过了其潜在的缺点。
ORM的主要上风包罗:

然而,利用ORM也需要衡量一些因素:

对于大多数现代web应用步伐和企业系统来说,ORM已经成为了标准工具。它不但简化了开发过程,还提高了代码质量和可维护性。然而,像全部工具一样,ORM也不是全能的。理解ORM的工作原理、上风和局限性,才能在适当的场景下做出精确的选择。
末了,记住:ORM和SQL并不黑白此即彼的选择。在实际项目中,你大概会发现将ORM与原生SQL联合利用是最佳实践。大多数ORM框架都提供了实行原生SQL的能力,让你能够在需要时利用SQL的全部功能。

无论你选择利用ORM照旧直接编写SQL,告急的是要理解底层的数据库原理,如许你才能做出明智的决策,并在需要时进行优化。持续学习和实践将资助你在差别场景下选择最合适的工具和方法。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4