SQLAlchemy,数据库操作大师Python库!

文摘   2024-12-18 00:02   贵州  

点击“蓝字”  关注我们


大家好,我是安夏!今天我要给大家介绍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()

注意事项:


  1. 记得在操作完成后调用commit()提交事务
  2. 使用完session后最好调用close()关闭会话
  3. 在实际项目中要做好异常处理

进阶查询技巧

# 条件查询

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()

实战小练习

试试实现以下功能:


  1. 创建一个Comment模型,与Post建立一对多关系
  2. 查询某篇文章的所有评论
  3. 统计每篇文章的评论数量

小伙伴们,今天的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()

注意事项:


  1. 在处理大量数据时,要注意查询性能
  2. 适时使用session.query(...).count()来获取结果数量
  3. 对于复杂查询,可以使用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)

练习题

  1. 实现多对多关系:创建Tag模型,实现文章和标签的多对多关联
  2. 编写一个函数,查询包含特定标签的所有文章
  3. 实现按评论数量对文章进行排序的功能

小伙伴们,今天的Python学习之旅就到这里啦!关系数据库的操作看似复杂,但通过SQLAlchemy,我们可以用优雅的方式来实现。记得动手实践哦,有问题随时在评论区问安夏学姐我!下次我们将学习SQLAlchemy的事务处理和性能优化技巧,敬请期待!祝大家学习愉快,Python学习节节高!


·end·

—如果喜欢,快分享给你的朋友们吧—

我们一起愉快的玩耍吧




EV电车视点
优质原创公众号
 最新文章