Python第十三课:数据库交互 | 信息帝国的基石
🎯 本节目标
- 理解SQL与NoSQL的核心差异
- 掌握SQL基础语法与设计范式
- 学会使用ORM简化数据库操作
- 开发实战项目:电商订单系统
- 掌握索引优化与事务管理
1️⃣ 数据库理论基石(先懂原理再写代码)
💡 数据库类型对比
📚 生活化比喻:
- SQL → 图书馆的索引目录(严格分类
- NoSQL → 创意市集的摊位(自由灵活)
🔑 关系型数据库三大范式
- 原子性:每列不可再分(如"姓名"应拆分为"姓"和"名")
- 唯一依赖:所有字段必须完全依赖主键
- 消除传递依赖:非主键字段间不能有依赖关系
2️⃣ SQL语法精要(结构化查询语言
*📜 基础操作四象限
**🔗 多表联查示例
SELECT orders.id, users.name, products.title
FROM orders
JOIN users ON orders.user_id = users.id
JOIN products ON orders.product_id = products.id
WHERE orders.status = 'paid';
3️⃣ ORM魔法:用Python操作数据库
✨ SQLAlchemy核心用法
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.orm import declarative_base, sessionmaker
# 定义基类
Base = declarative_base()
# 声明数据模型
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String(50))
email = Column(String(100))
# 初始化数据库连接
engine = create_engine('sqlite:///mydatabase.db')
Base.metadata.create_all(engine)
# 创建会话
Session = sessionmaker(bind=engine)
session = Session()
# 增删改查操作示例
new_user = User(name='王小明', email='wang@example.com')
session.add(new_user)
session.commit()
# 查询操作
users = session.query(User).filter(User.name.like('王%')).all()
4️⃣ 实战项目:电商订单系统
📦 数据库设计
class Product(Base):
__tablename__ = 'products'
id = Column(Integer, primary_key=True)
title = Column(String(100))
price = Column(Float)
stock = Column(Integer)
class Order(Base):
__tablename__ = 'orders'
id = Column(Integer, primary_key=True)
user_id = Column(Integer, ForeignKey('users.id'))
product_id = Column(Integer, ForeignKey('products.id'))
quantity = Column(Integer)
status = Column(String(20))
⚙️ 事务处理示例
def place_order(user_id, product_id, quantity):
try:
# 开启事务
product = session.query(Product).get(product_id)
if product.stock < quantity:
raise ValueError("库存不足")
# 扣减库存
product.stock -= quantity
# 创建订单
new_order = Order(
user_id=user_id,
product_id=product_id,
quantity=quantity,
status='pending'
)
session.add(new_order)
# 提交事务
session.commit()
return "下单成功"
except Exception as e:
session.rollback()
return f"下单失败:{str(e)}"
📚 知识图谱
数据库优化三叉戟:
┌──────────────┬───────────────────────────┐
| 技术 | 作用 |
├──────────────┼───────────────────────────┤
| 索引 | 加速数据检索(类似书籍目录) |
| 事务 | 保证ACID特性(原子性/一致性等)|
| 缓存 | 减少数据库压力(Redis/Memcached)|
└──────────────┴───────────────────────────┘
ACID原则:
- **原子性**(Atomicity):事务要么全完成,要么全不完成
- **一致性**(Consistency):事务保持数据库整体逻辑不变
- **隔离性**(Isolation):并发事务互不干扰
- **持久性**(Durability):事务提交后永久生效
🛠️ 课后挑战
- 为订单系统添加优惠券功能(需考虑过期时间与使用限制)
- 实现商品分页查询接口(LIMIT/OFFSET
- 使用索引优化百万级用户表的手机号查询
💡 参考答案提示:
# 创建索引示例
from sqlalchemy import Index
Index('idx_user_phone', User.phone)
# 分页查询
def get_products(page=1, per_page=10):
return session.query(Product)\
.limit(per_page)\
.offset((page-1)*per_page)\
.all()
🚀 下节剧透:《数据可视化:信息炼金术》
👉 你将解锁:
- Matplotlib科学绘图技巧
- Pyecharts交互式图表
- 大数据仪表盘开发
- 实战:疫情数据动态可视化