当前位置: 首页 > news >正文

利用Pandas进行数据分析:从资料清洗到可视化

SQLAlchemy是Python中最流行的ORM(对象关系映射)框架之一,它提供了高效且灵活的数据库操作方式。本文将介绍如何使用SQLAlchemy ORM进行数据库操作。

目录

  1. 安装SQLAlchemy

  2. 核心概念

  3. 连接数据库

  4. 定义数据模型

  5. 创建数据库表

  6. 基本CRUD操作

  7. 查询数据

  8. 关系操作

  9. 事务管理

  10. 最佳实践

安装

bash

pip install sqlalchemy

如果需要连接特定数据库,还需安装相应的驱动程序:

bash

# PostgreSQL
pip install psycopg2-binary# MySQL
pip install mysql-connector-python# SQLite (Python标准库已包含,无需额外安装)

核心概念

  • Engine:数据库连接的引擎,负责与数据库通信

  • Session:数据库会话,管理所有持久化操作

  • Model:数据模型类,对应数据库中的表

  • Query:查询对象,用于构建和执行数据库查询

连接数据库

python

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker# 创建数据库连接引擎
# SQLite示例
engine = create_engine('sqlite:///example.db', echo=True)# PostgreSQL示例
# engine = create_engine('postgresql://username:password@localhost:5432/mydatabase')# MySQL示例
# engine = create_engine('mysql+mysqlconnector://username:password@localhost:3306/mydatabase')# 创建会话工厂
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)# 创建会话实例
session = SessionLocal()

定义数据模型

python

from sqlalchemy import Column, Integer, String, ForeignKey
from sqlalchemy.orm import relationship, declarative_base# 创建基类
Base = declarative_base()class User(Base):__tablename__ = 'users'id = Column(Integer, primary_key=True, index=True)name = Column(String(50), nullable=False)email = Column(String(100), unique=True, index=True)# 定义一对多关系posts = relationship("Post", back_populates="author")class Post(Base):__tablename__ = 'posts'id = Column(Integer, primary_key=True, index=True)title = Column(String(100), nullable=False)content = Column(String(500))author_id = Column(Integer, ForeignKey('users.id'))# 定义多对一关系author = relationship("User", back_populates="posts")# 定义多对多关系(通过关联表)tags = relationship("Tag", secondary="post_tags", back_populates="posts")class Tag(Base):__tablename__ = 'tags'id = Column(Integer, primary_key=True, index=True)name = Column(String(30), unique=True, nullable=False)posts = relationship("Post", secondary="post_tags", back_populates="tags")# 关联表(用于多对多关系)
class PostTag(Base):__tablename__ = 'post_tags'post_id = Column(Integer, ForeignKey('posts.id'), primary_key=True)tag_id = Column(Integer, ForeignKey('tags.id'), primary_key=True)

创建数据库表

python

# 创建所有表
Base.metadata.create_all(bind=engine)# 删除所有表
# Base.metadata.drop_all(bind=engine)

基本CRUD操作

创建数据

python

# 创建新用户
new_user = User(name="张三", email="zhangsan@example.com")
session.add(new_user)
session.commit()# 批量创建
session.add_all([User(name="李四", email="lisi@example.com"),User(name="王五", email="wangwu@example.com")
])
session.commit()

读取数据

python

# 获取所有用户
users = session.query(User).all()# 获取第一个用户
first_user = session.query(User).first()# 根据ID获取用户
user = session.query(User).get(1)

更新数据

python

# 查询并更新
user = session.query(User).get(1)
user.name = "张三四"
session.commit()# 批量更新
session.query(User).filter(User.name.like("张%")).update({"name": "张氏"}, synchronize_session=False)
session.commit()

删除数据

python

# 查询并删除
user = session.query(User).get(1)
session.delete(user)
session.commit()# 批量删除
session.query(User).filter(User.name == "李四").delete(synchronize_session=False)
session.commit()

查询数据

基本查询

python

# 获取所有记录
users = session.query(User).all()# 获取特定字段
names = session.query(User.name).all()# 排序
users = session.query(User).order_by(User.name.desc()).all()# 限制结果数量
users = session.query(User).limit(10).all()# 偏移量
users = session.query(User).offset(5).limit(10).all()

过滤查询

python

from sqlalchemy import or_# 等值过滤
user = session.query(User).filter(User.name == "张三").first()# 模糊查询
users = session.query(User).filter(User.name.like("张%")).all()# IN查询
users = session.query(User).filter(User.name.in_(["张三", "李四"])).all()# 多条件查询
users = session.query(User).filter(User.name == "张三", User.email.like("%@example.com")
).all()# 或条件
users = session.query(User).filter(or_(User.name == "张三", User.name == "李四")
).all()# 不等于
users = session.query(User).filter(User.name != "张三").all()

聚合查询

python

from sqlalchemy import func# 计数
count = session.query(User).count()# 分组计数
user_post_count = session.query(User.name, func.count(Post.id)
).join(Post).group_by(User.name).all()# 求和、平均值等
avg_id = session.query(func.avg(User.id)).scalar()

连接查询

python

# 内连接
results = session.query(User, Post).join(Post).filter(Post.title.like("%Python%")).all()# 左外连接
results = session.query(User, Post).outerjoin(Post).all()# 指定连接条件
results = session.query(User, Post).join(Post, User.id == Post.author_id).all()

关系操作

python

# 创建带关系的对象
user = User(name="赵六", email="zhaoliu@example.com")
post = Post(title="我的第一篇博客", content="Hello World!", author=user)
session.add(post)
session.commit()# 通过关系访问
print(f"文章 '{post.title}' 的作者是 {post.author.name}")
print(f"用户 {user.name} 的所有文章:")
for p in user.posts:print(f"  - {p.title}")# 多对多关系操作
python_tag = Tag(name="Python")
sqlalchemy_tag = Tag(name="SQLAlchemy")post.tags.append(python_tag)
post.tags.append(sqlalchemy_tag)
session.commit()print(f"文章 '{post.title}' 的标签:")
for tag in post.tags:print(f"  - {tag.name}")

事务管理

python

# 自动提交事务
try:user = User(name="测试用户", email="test@example.com")session.add(user)session.commit()
except Exception as e:session.rollback()print(f"发生错误: {e}")# 使用事务上下文管理器
from sqlalchemy.orm import Sessiondef create_user(session: Session, name: str, email: str):try:user = User(name=name, email=email)session.add(user)session.commit()return userexcept:session.rollback()raise# 嵌套事务
with session.begin_nested():user = User(name="事务用户", email="transaction@example.com")session.add(user)# 保存点
savepoint = session.begin_nested()
try:user = User(name="保存点用户", email="savepoint@example.com")session.add(user)savepoint.commit()
except:savepoint.rollback()

最佳实践

  1. 会话管理:为每个请求创建新会话,请求结束后关闭

  2. 异常处理:始终处理异常并适当回滚事务

  3. 延迟加载:注意N+1查询问题,使用 eager loading 优化

  4. 连接池:合理配置连接池大小和超时设置

  5. 数据验证:在模型层或应用层验证数据完整性

python

# 使用上下文管理器管理会话
from contextlib import contextmanager@contextmanager
def get_db():db = SessionLocal()try:yield dbdb.commit()except Exception:db.rollback()raisefinally:db.close()# 使用示例
with get_db() as db:user = User(name="上下文用户", email="context@example.com")db.add(user)

总结

SQLAlchemy ORM提供了强大而灵活的数据库操作方式,通过本文的介绍,您应该能够:

  1. 安装和配置SQLAlchemy

  2. 定义数据模型和关系

  3. 执行基本的CRUD操作

  4. 构建复杂查询

  5. 管理数据库事务

  6. 遵循最佳实践

SQLAlchemy还有更多高级特性,如混合属性、事件监听、自定义查询等,值得进一步探索学习。

http://www.jsqmd.com/news/453287/

相关文章:

  • 2026年海安县中祥线业团队专业水平怎样,是否值得合作? - mypinpai
  • 远望流体领衔:2026年值得关注的微型隔膜气泵生产厂家经验谈 - 企师傅推荐官
  • 说说贵阳老牌的新能源汽修培训,价格实惠且证书认可度高的有哪些推荐? - myqiye
  • 从数据到决策:AI与多源遥感如何重塑精准农业
  • 2026合肥装饰公司推荐 实力口碑双优榜单 - 资讯焦点
  • 分析2026年知名的温泉酒店设计公司,哪家更靠谱 - 工业推荐榜
  • Sa-Token v1.45.0 发布 ,正式支持 Spring Boot 4、新增 Jackson3/Snack4 插件适配
  • 2026年长沙口碑好的品牌家装公司推荐,别墅家装公司正规排名大揭秘 - 工业设备
  • 英国留学文书写作技巧深度解析:四大英国留学机构服务对比与实战指南 - 资讯焦点
  • 路由器丨防火墙的工作原理和基本配置
  • 2026年比较好的足球防护网公司推荐:铁丝防护网品牌厂家推荐 - 行业平台推荐
  • 盲盒玩具厂推荐,汕头得志玩具厂靠谱吗,费用怎么算? - 工业品网
  • 全屋定制选购看口碑,曼海莲全案木作靠谱不? - 工业品网
  • 2026CRM选型手册:6大品牌客户管理系统能力分层与对比 - 毛毛鱼的夏天
  • 2026年过滤设备厂家实力推荐:润田节水——喷灌/碟片/Y型/T型/H型/介质过滤器全系供应,适配农业/工业多场景水质过滤 - 品牌推荐官
  • 想选门窗定制品牌,富奥斯门窗价格贵不贵,服务好不好? - 工业品牌热点
  • 聊聊AI优化公司服务价格,蓝戈链企在张家港收费贵吗 - 工业品牌热点
  • 2026年比较好的车间防护网品牌推荐:双边丝防护网/篮球场防护网公司推荐 - 行业平台推荐
  • 2026年全国松筒线制造企业,特色定制服务费用怎么收费 - mypinpai
  • 智慧空调推荐哪家?2026年最佳智能空调排行榜 - 资讯焦点
  • 2026年靠谱的城市公交站台公司推荐:智能公交站台/公交站台候车亭/城市公交站台候车亭厂家推荐 - 行业平台推荐
  • 2026年AI氛围灯怎么选?这份避坑指南与实力厂家排行榜请收好 - 企师傅推荐官
  • 聊聊耐用渔网线,海安县中祥线业靠谱吗? - mypinpai
  • 全国 国产工业阀门生产厂家优质推荐指南 - 真知灼见33
  • 2026年靠谱的乡村公交站台厂家推荐:公交站台定做/城市公交站台推荐公司 - 行业平台推荐
  • 2026年工业特种机器人厂家实力推荐:波士顿机器人(山东)有限公司,防爆巡检与智能消防灭火机器人技术领先之选 - 品牌推荐官
  • 2026 年 3 月上海智推时代:GEO 官方合作渠道与商务对接全指南 - 速递信息
  • 讲解外籍工作许可延期合规申请手续,上海美西咨询服务如何 - myqiye
  • 眼周初老别慌!38 大促眼霜推荐,这支全能眼霜闭眼冲 - 速递信息
  • bat以隐藏模式运行jar包