Python 数据库 ORM 实战:SQLAlchemy 详解

Python 数据库 ORM 实战:SQLAlchemy 详解

1. 背景与动机

ORM(对象关系映射)简化了数据库操作,使开发者可以使用面向对象的方式操作数据库。SQLAlchemy 是 Python 最强大的 ORM 工具,提供了灵活且功能丰富的数据库操作接口。

2. 基础配置

python 复制代码
from sqlalchemy import create_engine, Column, Integer, String, DateTime
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
from datetime import datetime

engine = create_engine('postgresql://user:password@localhost/dbname')
Base = declarative_base()
Session = sessionmaker(bind=engine)

3. 模型定义

python 复制代码
class User(Base):
    __tablename__ = 'users'
    
    id = Column(Integer, primary_key=True)
    username = Column(String(80), unique=True, nullable=False)
    email = Column(String(120), unique=True)
    created_at = Column(DateTime, default=datetime.utcnow)
    
    def __repr__(self):
        return f'<User {self.username}>'

# 创建表
Base.metadata.create_all(engine)

4. CRUD 操作

python 复制代码
session = Session()

# 创建
new_user = User(username='alice', email='alice@example.com')
session.add(new_user)
session.commit()

# 查询
user = session.query(User).filter_by(username='alice').first()
users = session.query(User).filter(User.id > 5).all()

# 更新
user.email = 'new_email@example.com'
session.commit()

# 删除
session.delete(user)
session.commit()

session.close()

5. 高级查询

python 复制代码
from sqlalchemy import func, and_, or_

# 聚合查询
result = session.query(
    func.count(User.id),
    func.max(User.created_at)
).first()

# 联合查询
from sqlalchemy.orm import joinedload

users_with_posts = session.query(User).options(
    joinedload(User.posts)
).all()

# 分页
users = session.query(User).offset(10).limit(10).all()

6. 性能优化

python 复制代码
# 连接池配置
engine = create_engine(
    'postgresql://user:password@localhost/dbname',
    pool_size=10,
    max_overflow=20,
    pool_pre_ping=True
)

# 批量插入
session.bulk_save_objects([User(username=f'user{i}') for i in range(1000)])
session.commit()

7. 结论

SQLAlchemy 提供了从简单到复杂的数据库操作能力,通过 ORM 可以显著提高开发效率,同时保持对 SQL 的灵活控制。

相关推荐
赵广陆1 分钟前
Cline与Cherry Studio中配置MCP Server
人工智能
梦想不只是梦与想3 分钟前
环境管理:Conda 与 venv
python·conda·uv
Yolanda_20224 分钟前
6.pytorch加载数据初认识
python
邵奈一5 分钟前
【紧急处理ZCode事件】ZCode 工作区快照静默上传:检测方法与三层防护实践
人工智能·学习·大模型·国产
更深兼春远6 分钟前
Python到底怎么用于测试?
自动化测试·软件测试·python·接口测试
烟雨江南7859 分钟前
会议语音识别私有化部署方案:音频不出内网,如何接入现有会议系统
人工智能·websocket·音视频·语音识别·ai客服
hzxxxz11 分钟前
从 2.4T 到 284B:模型变小之后,企业 AI 投入的 3 笔账
人工智能
4SAPI12 分钟前
大模型 API 聚合平台选型指南:企业与个人用户的接入架构、稳定性与成本评估
人工智能·php·agent
我不会起名字32213 分钟前
一天一道力扣Hot100(36):深度优先算法---组合总和
数据结构·c++·后端·python·算法·go
小K讲AI营销14 分钟前
AI基础设施融资路径的中美比较:资本市场模式与政策金融模式
大数据·数据库·人工智能