大家好,我是安夏!今天我要给大家介绍Python界最受欢迎的ORM(对象关系映射)框架 - SQLAlchemy。通过它,我们可以用面向对象的方式来操作数据库,告别繁琐的SQL语句。无论你是数据分析师还是Web开发者,掌握SQLAlchemy都能让你的数据库操作事半功倍!
## 为什么要用SQLAlchemy?
还记得我刚开始学习数据库操作时,需要写很多原生SQL语句。不仅容易出错,还要记住各种数据库方言的语法差异。有了SQLAlchemy后,我们可以:
- 用Python类来映射数据库表
- 用简单的Python方法来执行各种数据库操作
- 自动处理不同数据库之间的差异
- 提供强大的查询构建器
## 快速上手
首先安装SQLAlchemy:
```python
pip install sqlalchemy
1. 创建数据库连接
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
# 创建数据库引擎
engine = create_engine('sqlite:///blog.db')
# 创建基类
Base = declarative_base()
# 创建Session类
Session = sessionmaker(bind=engine)
小贴士: SQLAlchemy支持多种数据库,比如MySQL(mysql://
)、PostgreSQL(postgresql://
)等,只需修改连接字符串即可。
2. 定义数据模型
from sqlalchemy import Column, Integer, String, DateTime
import datetime
class Post(Base):
__tablename__ = 'posts'
id = Column(Integer, primary_key=True)
title = Column(String(100))
content = Column(String(500))
created_time = Column(DateTime, default=datetime.datetime.now)
def __repr__(self):
return f“<Post(title='{self.title}')>”
3. 基本操作示例
# 创建数据表
Base.metadata.create_all(engine)
# 创建会话
session = Session()
# 添加数据
new_post = Post(title='SQLAlchemy真好用!',
content='这是我的第一篇博客...')
session.add(new_post)
session.commit()
# 查询数据
posts = session.query(Post).all()
for post in posts:
print(f“标题: {post.title}”)
# 更新数据
post = session.query(Post).first()
post.title = '更新后的标题'
session.commit()
# 删除数据
session.delete(post)
session.commit()
注意事项:
- 使用完session后最好调用
close()
关闭会话
# 条件查询
recent_posts = session.query(Post).\
filter(Post.created_time >= datetime.datetime(2024, 1, 1)).\
all()
# 排序
sorted_posts = session.query(Post).\
order_by(Post.created_time.desc()).\
all()
# 限制返回数量
latest_posts = session.query(Post).\
order_by(Post.created_time.desc()).\
limit(5).\
all()
试试实现以下功能:
- 创建一个Comment模型,与Post建立一对多关系
小伙伴们,今天的Python学习之旅就到这里啦!记得动手敲代码,有问题随时在评论区问安夏学姐我哦。SQLAlchemy的功能还有很多,比如关系映射、事务处理等,我们下次再聊!祝大家学习愉快,Python学习节节高!
大家好,我是安夏!上次我们学习了SQLAlchemy的基础用法,今天我们来深入探讨一些高级特性。掌握这些技巧,你就能更优雅地处理复杂的数据库操作啦!
## 关系映射:一对多关系
在实际开发中,表与表之间经常需要建立关联。比如一篇博客文章可以有多条评论,这就是典型的一对多关系。让我们来看看如何实现:
```python
from sqlalchemy import ForeignKey
from sqlalchemy.orm import relationship
class Post(Base):
__tablename__ = 'posts'
id = Column(Integer, primary_key=True)
title = Column(String(100))
content = Column(String(500))
comments = relationship(“Comment”, back_populates=“post”)
def __repr__(self):
return f“<Post(title='{self.title}')>”
class Comment(Base):
__tablename__ = 'comments'
id = Column(Integer, primary_key=True)
content = Column(String(200))
post_id = Column(Integer, ForeignKey('posts.id'))
post = relationship(“Post”, back_populates=“comments”)
def __repr__(self):
return f“<Comment(content='{self.content[:20]}...')>”
小贴士:relationship()
函数用于定义两个模型之间的关系,back_populates
参数用于指定反向引用的属性名。
# 创建一篇文章和相关评论
new_post = Post(title='SQLAlchemy关系映射', content='学习使用relationship...')
comment1 = Comment(content='写得真好!')
comment2 = Comment(content='学习了!')
# 建立关联
new_post.comments.append(comment1)
new_post.comments.append(comment2)
# 保存到数据库
session.add(new_post)
session.commit()
# 查询文章的所有评论
post = session.query(Post).first()
for comment in post.comments:
print(comment.content)
# 查询评论所属的文章
comment = session.query(Comment).first()
print(f“这条评论属于文章:{comment.post.title}”)
1. 连接查询
# 内连接
results = session.query(Post, Comment).\
join(Comment).\
all()
# 左外连接
results = session.query(Post, Comment).\
outerjoin(Comment).\
all()
2. 子查询
from sqlalchemy import func
# 统计每篇文章的评论数
comment_counts = session.query(
Post.title,
func.count(Comment.id).label('comment_count')
).\
outerjoin(Comment).\
group_by(Post.id).\
all()
for title, count in comment_counts:
print(f“文章《{title}》有{count}条评论”)
3. 过滤条件组合
from sqlalchemy import or_, and_
# 复杂条件查询
results = session.query(Post).\
filter(
and_(
Post.title.like('%SQLAlchemy%'),
or_(
Post.id > 10,
Post.content.contains('Python')
)
)
).\
all()
注意事项:
- 适时使用
session.query(...).count()
来获取结果数量 - 对于复杂查询,可以使用
session.query(...).statement
查看生成的SQL语句
1. 批量操作
# 批量插入
session.bulk_save_objects([
Comment(content='评论1', post_id=1),
Comment(content='评论2', post_id=1),
Comment(content='评论3', post_id=1)
])
session.commit()
2. 分页查询
page = 1
per_page = 10
query = session.query(Post).\
order_by(Post.id).\
offset((page - 1) * per_page).\
limit(per_page)
- 实现多对多关系:创建Tag模型,实现文章和标签的多对多关联
小伙伴们,今天的Python学习之旅就到这里啦!关系数据库的操作看似复杂,但通过SQLAlchemy,我们可以用优雅的方式来实现。记得动手实践哦,有问题随时在评论区问安夏学姐我!下次我们将学习SQLAlchemy的事务处理和性能优化技巧,敬请期待!祝大家学习愉快,Python学习节节高!
·end·
—如果喜欢,快分享给你的朋友们吧—
我们一起愉快的玩耍吧