Python ORM 基础教程 – wiki大全

Python ORM 基础教程:简化数据库交互的艺术

在现代软件开发中,数据存储是核心环节。对于使用 Python 进行开发的应用程序而言,与关系型数据库的交互是不可避免的。传统的数据库操作方式通常涉及编写原始 SQL 查询,这不仅繁琐,容易出错,而且难以维护。这时,对象关系映射 (Object-Relational Mapping, ORM) 技术应运而生,它提供了一种更高级、更面向对象的方式来处理数据库。

本教程将详细介绍 Python ORM 的基本概念、优势,并通过实际示例(以 SQLAlchemy 为主)展示其核心用法。

什么是 ORM?

ORM 是一种编程技术,它允许开发者使用面向对象的方式来操作关系型数据库。简而言之,ORM 充当了你的应用程序代码(通常是 Python 对象)和数据库(通常是表和行)之间的桥梁。

  • 将数据库表映射到类 (Classes): 数据库中的每个表都可以被映射为一个 Python 类。
  • 将数据库行映射到对象 (Objects): 表中的每一行数据都可以被表示为该类的一个实例(对象)。
  • 将数据库列映射到对象属性 (Attributes): 表中的每个列则对应着类中的一个属性。

通过 ORM,你不再需要手动编写 SQL 语句,而是通过操作 Python 对象来执行数据库的增删改查 (CRUD) 操作。ORM 会负责将你的对象操作转换为相应的 SQL 查询,并将其发送到数据库执行。

使用 ORM 的主要优势

  1. 抽象化 (Abstraction):

    • 隐藏 SQL 细节: 开发者无需精通特定数据库的 SQL 方言。ORM 会自动生成适合目标数据库的 SQL。
    • 数据库切换更便捷: 在许多情况下,更换底层数据库(例如从 SQLite 切换到 PostgreSQL)只需修改少量配置,而无需重写大量 SQL 代码。
  2. 提高开发效率 (Increased Productivity):

    • 减少代码量: 使用 Python 对象进行数据操作比手动构建 SQL 字符串更快、更简洁。
    • 更易读、更易维护: 对象模型通常比嵌入式 SQL 更符合应用程序的逻辑结构。
  3. 安全性 (Security):

    • 防止 SQL 注入: ORM 在生成 SQL 查询时,通常会采用参数化查询或预编译语句,从而有效防止 SQL 注入攻击。
  4. 面向对象的好处 (Object-Oriented Benefits):

    • 代码复用: 可以利用 Python 类的继承、多态等特性来构建更强大、更灵活的数据模型。
    • 类型安全: 许多 ORM 结合类型提示 (type hints) 可以提供更好的代码补全和错误检查。

流行 Python ORMs

Python 社区拥有多个成熟且功能强大的 ORM 库,其中最受欢迎的包括:

  • SQLAlchemy: 被认为是 Python 中最全面、功能最强大的 ORM。它既提供了低级的 SQL Expression Language (SQL Core),也提供了高级的 ORM 封装,适用于各种规模的项目。
  • Peewee: 一个轻量级、简单易用的 ORM,以其简洁的 API 和较小的代码量而闻名,适合小型项目或对性能有较高要求的场景。
  • Django ORM: Django Web 框架内置的 ORM,与 Django 生态系统紧密集成,是 Django 项目开发的首选。

在本教程中,我们将以 SQLAlchemy 为例,介绍 ORM 的基本使用方法。

SQLAlchemy 基础教程

1. 安装 SQLAlchemy

首先,你需要使用 pip 来安装 SQLAlchemy:

bash
pip install sqlalchemy

2. 连接到数据库

SQLAlchemy 支持多种数据库。这里我们使用 SQLite 内存数据库作为示例,它不需要额外的配置,非常适合快速测试。

“`python
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker

创建一个数据库引擎。

‘sqlite:///:memory:’ 表示使用内存中的 SQLite 数据库。

如果想连接文件数据库,可以使用 ‘sqlite:///./test.db’

engine = create_engine(‘sqlite:///:memory:’, echo=True) # echo=True 会打印所有生成的 SQL 语句

创建一个 Session 类。Session 是与数据库进行对话的入口点。

Session = sessionmaker(bind=engine)

创建一个 Session 实例

session = Session()
“`

echo=True 参数非常有用,它会把 SQLAlchemy 生成的所有 SQL 语句打印到控制台,这对于理解 ORM 的工作原理和调试非常有帮助。

3. 定义数据模型 (Model)

数据模型是 ORM 的核心。我们使用 SQLAlchemy 的 declarative_base 来定义我们的类,这些类将映射到数据库表。

“`python
from sqlalchemy import Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

class User(Base):
tablename = ‘users’ # 数据库中的表名

id = Column(Integer, primary_key=True) # 主键
name = Column(String)
email = Column(String, unique=True) # 电子邮件必须唯一

def __repr__(self):
    return f"<User(id={self.id}, name='{self.name}', email='{self.email}')>"

创建所有在 Base 中定义的表

Base.metadata.create_all(engine)
“`

在这个 User 类中:
* __tablename__ = 'users' 指定了对应的数据库表名为 users
* Column 用于定义表的列及其数据类型(如 Integer, String)。
* primary_key=Trueid 列设置为主键。
* unique=True 确保 email 列的值是唯一的。
* __repr__ 方法有助于在打印 User 对象时显示有用的信息。

Base.metadata.create_all(engine) 会根据我们定义的模型,在数据库中创建相应的表。

4. CRUD 操作

现在我们已经定义了模型并连接了数据库,可以开始进行数据的增删改查操作了。

a. 创建 (Create)

创建新用户非常简单,只需创建 User 类的实例,然后将其添加到 session 并提交。

“`python

创建新的 User 对象

user1 = User(name=’Alice’, email=’[email protected]’)
user2 = User(name=’Bob’, email=’[email protected]’)

添加到 session

session.add(user1)
session.add(user2)

提交事务,将数据保存到数据库

session.commit()

print(“Created users:”, user1, user2)
“`

b. 读取 (Read)

读取数据是 ORM 最常用的功能之一。SQLAlchemy 提供了多种查询方式。

查询所有记录:

“`python

查询所有用户

all_users = session.query(User).all()
print(“\nAll users:”)
for user in all_users:
print(user)
“`

按条件查询 (过滤):

“`python

查询名字为 ‘Alice’ 的用户

alice = session.query(User).filter_by(name=’Alice’).first()
print(f”\nUser named Alice: {alice}”)

查询 email 包含 ‘example.com’ 的用户

example_users = session.query(User).filter(User.email.like(‘%example.com%’)).all()
print(“\nUsers with email containing ‘example.com’:”)
for user in example_users:
print(user)

可以链式调用多个 filter

bob_user = session.query(User).filter_by(name=’Bob’).filter_by(email=’[email protected]’).first()
print(f”\nUser Bob with specific email: {bob_user}”)
“`

通过 ID 查询 (最常见):

“`python

通过主键 ID 查询

user_by_id = session.query(User).get(1) # get() 只能通过主键查询
print(f”\nUser with ID 1: {user_by_id}”)
“`

c. 更新 (Update)

更新数据首先需要查询到要修改的对象,然后修改其属性,最后提交 session。

“`python

查询要更新的用户

user_to_update = session.query(User).filter_by(name=’Alice’).first()

if user_to_update:
user_to_update.name = ‘Alicia’
user_to_update.email = ‘[email protected]
session.commit() # 提交更改
print(f”\nUpdated user: {user_to_update}”)
“`

d. 删除 (Delete)

删除数据同样需要查询到要删除的对象,然后从 session 中删除,并提交。

“`python

查询要删除的用户

user_to_delete = session.query(User).filter_by(name=’Bob’).first()

if user_to_delete:
session.delete(user_to_delete)
session.commit() # 提交删除
print(f”\nDeleted user: {user_to_delete}”)

再次查询所有用户,确认 Bob 已被删除

remaining_users = session.query(User).all()
print(“\nRemaining users after deletion:”)
for user in remaining_users:
print(user)
“`

5. 关系 (Relationships) (简要提及)

实际的数据库通常包含多个表,并通过外键建立关系(如一对多、多对多)。SQLAlchemy 提供了强大的功能来定义和管理这些关系,例如 relationship() 函数。

例如,一个用户可以有多个地址,这就是一对多的关系。

“`python

from sqlalchemy import ForeignKey

from sqlalchemy.orm import relationship

class Address(Base):

tablename = ‘addresses’

id = Column(Integer, primary_key=True)

street = Column(String)

user_id = Column(Integer, ForeignKey(‘users.id’)) # 外键

user = relationship(“User”, back_populates=”addresses”) # 建立反向关系

def repr(self):

return f”

User.addresses = relationship(“Address”, order_by=Address.id, back_populates=”user”)

“`

定义关系后,你可以像操作普通属性一样操作关联对象,ORM 会自动处理底层的联结查询。

总结

Python ORM 技术极大地简化了与关系型数据库的交互。通过将数据库表映射为 Python 对象,开发者能够以更自然、更面向对象的方式来管理数据,从而提高开发效率、增强代码可读性和可维护性,并有效防止常见的安全漏洞。

选择哪个 ORM 取决于你的项目需求:
* SQLAlchemy 适用于需要高度灵活性和强大功能的复杂项目。
* Peewee 适用于追求简洁和轻量级的项目。
* Django ORM 是 Django Web 应用程序的理想选择,因为它与框架深度集成。

无论你选择哪个 ORM,掌握其基本原理和操作,都将是你 Python 数据库开发技能中宝贵的一部分。开始你的 ORM 之旅吧!

“`python

最后关闭 session

session.close()
“`

滚动至顶部