python 中 ORM 是什么 如何使用?
Python ORM 简介与使用
什么是 ORM?
ORM(Object-Relational Mapping,对象关系映射)是一种编程技术,用于将对象模型与关系型数据库之间进行转换。它允许开发者使用面向对象的方式来操作数据库,而不需要直接编写 SQL 语句。
主要优势
- 提高开发效率:避免编写复杂的 SQL 语句
- 数据库无关性:可以轻松切换不同的数据库
- 类型安全:提供编译时检查
- 代码可读性:更直观的数据库操作方式
常见的 Python ORM 框架
1. SQLAlchemy(最流行)
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker# 创建基类
Base = declarative_base()# 定义模型
class User(Base):__tablename__ = 'users'id = Column(Integer, primary_key=True)name = Column(String(50))email = Column(String(100))def __repr__(self):return f"<User(name='{self.name}', email='{self.email}')>"# 创建数据库连接
engine = create_engine('sqlite:///example.db')
Base.metadata.create_all(engine)# 创建会话
Session = sessionmaker(bind=engine)
session = Session()# 增加数据
new_user = User(name='张三', email='zhangsan@example.com')
session.add(new_user)
session.commit()# 查询数据
users = session.query(User).all()
user = session.query(User).filter_by(name='张三').first()# 更新数据
user.email = 'newemail@example.com'
session.commit()# 删除数据
session.delete(user)
session.commit()# 关闭会话
session.close()
2. Django ORM
# models.py
from django.db import modelsclass User(models.Model):name = models.CharField(max_length=50)email = models.CharField(max_length=100)created_at = models.DateTimeField(auto_now_add=True)def __str__(self):return self.name# 使用示例(在 Django 视图中)
from .models import User# 创建
user = User.objects.create(name='张三', email='zhangsan@example.com')# 查询
all_users = User.objects.all()
user = User.objects.get(id=1)
users = User.objects.filter(name__contains='张')# 更新
User.objects.filter(id=1).update(email='newemail@example.com')# 删除
User.objects.filter(id=1).delete()
3. Peewee(轻量级)
from peewee import *# 创建数据库连接
db = SqliteDatabase('my_app.db')# 定义模型
class BaseModel(Model):class Meta:database = dbclass User(BaseModel):name = CharField()email = CharField()def __str__(self):return self.name# 创建表
db.create_tables([User])# 增加数据
user = User.create(name='张三', email='zhangsan@example.com')# 查询数据
users = User.select()
user = User.get(User.name == '张三')# 更新数据
query = User.update(email='newemail@example.com').where(User.id == 1)
query.execute()# 删除数据
query = User.delete().where(User.id == 1)
query.execute()
SQLAlchemy 高级用法
关系映射
from sqlalchemy import ForeignKey
from sqlalchemy.orm import relationshipclass User(Base):__tablename__ = 'users'id = Column(Integer, primary_key=True)name = Column(String(50))# 一对多关系posts = relationship("Post", back_populates="author")class Post(Base):__tablename__ = 'posts'id = Column(Integer, primary_key=True)title = Column(String(100))content = Column(String(500))user_id = Column(Integer, ForeignKey('users.id'))author = relationship("User", back_populates="posts")# 使用关系
user = session.query(User).first()
user_posts = user.posts # 获取用户的所有文章
查询进阶
# 复杂查询
users = session.query(User).filter(User.name.like('%张%')
).order_by(User.id.desc()).limit(10).all()# 连接查询
result = session.query(User, Post).join(Post).filter(User.id == Post.user_id
).all()# 聚合查询
from sqlalchemy import func
count = session.query(func.count(User.id)).scalar()
选择建议
- SQLAlchemy:功能最强大,适合复杂项目
- Django ORM:与 Django 框架集成最好
- Peewee:轻量级,适合小型项目
- Tortoise ORM:异步支持,适合现代异步应用
ORM 是现代 Python 开发中处理数据库的重要工具,选择合适的 ORM 可以大大提高开发效率和代码质量。