Python 魔法学院 – 第32篇:Python ORM框架 ⭐⭐⭐

目录

  • 引言
  • 1. ORM 框架概述
  • 1.1 什么是 ORM?
  • 比喻:ORM 就像一位翻译官
  • 1.2 ORM 的优势
  • 2. [SQLAlchemy](https://docs.sqlalchemy.org.cn/en/20/intro.html)
  • 2.1 SQLAlchemy 简介
  • 2.2 SQLAlchemy 的核心组件
  • 2.3 SQLAlchemy 示例
  • 2.3.1 安装 SQLAlchemy
  • 2.3.2 定义模型
  • 2.3.3 插入数据
  • 2.3.4 查询数据
  • 2.3.5 更新数据
  • 2.3.6 删除数据
  • 2.4 SQLAlchemy 的内存结构
  • 2.4.1 多表关联查询示例
  • 3. Django ORM
  • 3.1 Django ORM 简介
  • 3.2 Django ORM 的核心组件
  • 3.3 Django ORM 示例
  • 3.3.1 安装 Django
  • 3.3.2 创建 Django 项目
  • 3.3.3 定义模型
  • 3.3.4 迁移数据库
  • 3.3.5 插入数据
  • 3.3.6 查询数据
  • 3.3.7 更新数据
  • 3.3.8 删除数据
  • 3.4 Django ORM 的内存结构
  • 3.4.1 多表关联查询示例
  • 4. SQLAlchemy 与 Django ORM 的对比
  • 5.常见问题解答(FAQ)
  • Q1: SQLAlchemy 和 Django ORM 哪个更适合初学者?
  • Q2: 如何处理 ORM 的性能问题?
  • Q3: 如果我的项目需要复杂的查询,应该选择哪个 ORM?
  • 6. 总结
  • 引言

    在软件开发的世界中,数据库操作是不可或缺的一部分。然而,直接使用 SQL 语句进行数据库操作往往繁琐且容易出错。为了解决这个问题,ORM(Object-Relational Mapping)框架应运而生。ORM 框架允许开发者使用面向对象的方式来操作数据库,极大地提高了开发效率和代码的可维护性。

    本文将深入探讨 Python 中两个主流的 ORM 框架:SQLAlchemyDjango ORM。我们将通过实际案例来展示它们的强大功能,并对比它们的优缺点,帮助你在实际开发中做出明智的选择。


    1. ORM 框架概述

    1.1 什么是 ORM?

    ORM(Object-Relational Mapping)是一种编程技术,用于在面向对象编程语言中,将对象与关系型数据库中的表进行映射。通过 ORM,开发者可以使用面向对象的方式来操作数据库,而不需要直接编写 SQL 语句。

    比喻:ORM 就像一位翻译官

    ORM 就像一位翻译官,它能够将 Python 对象的“语言”翻译成数据库能理解的 SQL 语句。无论是插入、查询还是更新数据,ORM 都能帮你轻松搞定,再也不用担心写错 SQL 语句了!

    1.2 ORM 的优势

  • 提高开发效率:ORM 框架自动生成 SQL 语句,减少了手动编写 SQL 的工作量。
  • 减少错误:ORM 框架提供了类型检查和语法检查,减少了 SQL 注入等安全风险。
  • 易于维护:ORM 框架将数据库操作抽象为对象操作,代码更易于理解和维护。
  • 跨数据库支持:ORM 框架通常支持多种数据库,切换数据库时无需修改代码。

  • 2. SQLAlchemy

    2.1 SQLAlchemy 简介

    SQLAlchemy 是 Python 中最流行的 ORM 框架之一,它提供了强大的 SQL 表达式语言和 ORM 功能。SQLAlchemy 的核心思想是将数据库操作抽象为 Python 对象操作,同时保留了直接使用 SQL 的灵活性。

    2.2 SQLAlchemy 的核心组件

  • Engine:负责与数据库建立连接。
  • Session:负责管理数据库会话。
  • Model:定义数据库表结构的 Python 类。
  • Query:用于构建和执行数据库查询。
  • 2.3 SQLAlchemy 示例

    2.3.1 安装 SQLAlchemy
    pip install sqlalchemy
    
    2.3.2 定义模型
    from sqlalchemy import create_engine, Column, Integer, String
    from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy.orm import sessionmaker
    
    # 创建引擎
    engine = create_engine('sqlite:///example.db', echo=True)
    
    # 创建基类
    Base = declarative_base()
    
    # 定义模型
    class User(Base):
        __tablename__ = 'users'
        id = Column(Integer, primary_key=True)
        name = Column(String)
        age = Column(Integer)
    
    # 创建表
    Base.metadata.create_all(engine)
    
    # 创建会话
    Session = sessionmaker(bind=engine)
    session = Session()
    
    2.3.3 插入数据
    # 创建新用户
    new_user = User(name='Alice', age=25)  # 实例化 User 对象
    session.add(new_user)  # 将对象添加到 Session 中
    session.commit()  # 提交事务,将数据保存到数据库
    
    2.3.4 查询数据
    # 查询所有用户
    users = session.query(User).all()
    for user in users:
        print(user.name, user.age)
    
    # 输出结果:
    # Alice 25
    
    2.3.5 更新数据
    # 更新用户年龄
    user = session.query(User).filter_by(name='Alice').first()
    user.age = 26
    session.commit()
    
    2.3.6 删除数据
    # 删除用户
    user = session.query(User).filter_by(name='Alice').first()
    session.delete(user)
    session.commit()
    

    2.4 SQLAlchemy 的内存结构

    在执行上述操作时,SQLAlchemy 会在内存中维护一个对象关系映射。以下是一个更详细的内存结构模拟:

    # 内存中的 User 对象
    {
        'id': 1,
        'name': 'Alice',
        'age': 25,
        '_sa_instance_state': <sqlalchemy.orm.state.InstanceState object at 0x7f8b1c2b3d90>
    }
    
    # 内存中的 Session 对象
    {
        'new': {<User object at 0x7f8b1c2b3d90>},
        'dirty': set(),
        'deleted': set(),
        'identity_map': {
            1: <User object at 0x7f8b1c2b3d90>
        }
    }
    
    2.4.1 多表关联查询示例
    class Address(Base):
        __tablename__ = 'addresses'
        id = Column(Integer, primary_key=True)
        email = Column(String)
        user_id = Column(Integer, ForeignKey('users.id'))
        user = relationship("User", back_populates="addresses")
    
    User.addresses = relationship("Address", order_by=Address.id, back_populates="user")
    
    # 查询用户及其地址
    user = session.query(User).filter_by(name='Alice').first()
    for address in user.addresses:
        print(address.email)
    

    3. Django ORM

    3.1 Django ORM 简介

    Django ORM 是 Django 框架内置的 ORM 工具,它提供了简单易用的 API 来操作数据库。Django ORM 的设计理念是“约定优于配置”,开发者只需定义模型,Django 会自动处理数据库的创建、查询、更新和删除操作。

    3.2 Django ORM 的核心组件

  • Model:定义数据库表结构的 Python 类。
  • Manager:用于执行数据库查询的接口。
  • QuerySet:表示数据库查询结果的集合。
  • 3.3 Django ORM 示例

    3.3.1 安装 Django
    pip install django
    
    3.3.2 创建 Django 项目
    django-admin startproject myproject
    cd myproject
    python manage.py startapp myapp
    
    3.3.3 定义模型
    # myapp/models.py
    from django.db import models
    
    class User(models.Model):
        name = models.CharField(max_length=100)
        age = models.IntegerField()
    
        def __str__(self):
            return self.name
    
    3.3.4 迁移数据库
    python manage.py makemigrations
    python manage.py migrate
    
    3.3.5 插入数据
    # 创建新用户
    from myapp.models import User
    user = User(name='Bob', age=30)
    user.save()
    
    3.3.6 查询数据
    # 查询所有用户
    users = User.objects.all()
    for user in users:
        print(user.name, user.age)
    
    # 输出结果:
    # Bob 30
    
    3.3.7 更新数据
    # 更新用户年龄
    user = User.objects.get(name='Bob')
    user.age = 31
    user.save()
    
    3.3.8 删除数据
    # 删除用户
    user = User.objects.get(name='Bob')
    user.delete()
    

    3.4 Django ORM 的内存结构

    SQLAlchemy 类似,Django ORM 也会在内存中维护对象关系映射。以下是一个更详细的内存结构模拟:

    # 内存中的 User 对象
    {
        'id': 1,
        'name': 'Bob',
        'age': 30,
        '_state': <django.db.models.base.ModelState object at 0x7f8b1c2b3d90>
    }
    
    # 内存中的 QuerySet 对象
    {
        'model': <class 'myapp.models.User'>,
        'query': <django.db.models.sql.query.Query object at 0x7f8b1c2b3d90>,
        'result_cache': [<User: Bob>]
    }
    
    3.4.1 多表关联查询示例
    class Address(models.Model):
        email = models.CharField(max_length=100)
        user = models.ForeignKey(User, on_delete=models.CASCADE)
    
    # 查询用户及其地址
    user = User.objects.get(name='Bob')
    for address in user.address_set.all():
        print(address.email)
    

    4. SQLAlchemy 与 Django ORM 的对比

    特性 SQLAlchemy Django ORM
    灵活性 高,支持复杂的 SQL 表达式 中,遵循“约定优于配置”原则
    性能 高,优化了 SQL 生成和执行 中,适合中小型项目
    学习曲线 高,功能强大但学习成本较高 低,易于上手
    数据库支持 广泛,支持多种数据库 广泛,支持多种数据库
    集成性 独立库,可与任何 Python 项目集成 集成于 Django 框架,适合 Django 项目
    社区支持 强大,有丰富的文档和社区资源 强大,Django 社区活跃

    5.常见问题解答(FAQ)

    Q1: SQLAlchemy 和 Django ORM 哪个更适合初学者?

  • A1: Django ORM 更适合初学者,因为它遵循“约定优于配置”的原则,学习曲线较低。
  • Q2: 如何处理 ORM 的性能问题?

  • A2: 可以通过以下方式优化 ORM 性能:
  • 使用 select_relatedjoinedload 减少查询次数。
  • 避免 N+1 查询问题。
  • 使用数据库索引优化查询性能。
  • Q3: 如果我的项目需要复杂的查询,应该选择哪个 ORM?

  • A3: 如果你的项目需要复杂的查询,SQLAlchemy 是更好的选择,因为它提供了更灵活的 SQL 表达式语言。
  • 6. 总结

    SQLAlchemyDjango ORM 都是 Python 中非常优秀的 ORM 框架,它们各有优缺点。SQLAlchemy 更适合需要高度灵活性和复杂查询的场景,而 Django ORM 则更适合快速开发和中小型项目。

    无论你选择哪个框架,ORM 都能极大地提高你的开发效率,减少错误,并使代码更易于维护。希望本文能帮助你更好地理解和使用 Python 中的 ORM 框架,激发你对 Python 开发的兴趣。

    作者:星核日记

    物联沃分享整理
    物联沃-IOTWORD物联网 » Python 魔法学院 – 第32篇:Python ORM框架 ⭐⭐⭐

    发表回复