当前位置:首页 > 技术 > 正文内容

Python项目结构设计指南

访客 技术 2026年7月19日 1

SQLAlchemy ORM实战应用

SQLAlchemy作为Python生态中最强大的ORM框架,提供了灵活的数据库交互方案。本文将深入解析其核心组件及实际应用场景。

环境准备

pip install sqlalchemy

针对不同数据库需额外安装驱动:

pip install psycopg2-binary  # PostgreSQL
pip install mysql-connector-python  # MySQL

核心组件解析

  • Engine:数据库连接引擎,负责底层通信
  • Session:事务管理接口,控制持久化操作
  • Model:数据实体类,映射数据库表结构
  • Query:查询构建器,支持复杂查询操作

数据库连接配置

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker

# 数据库连接实例
db_engine = create_engine('sqlite:///app.db', echo=False)

# 会话工厂创建
SessionFactory = sessionmaker(bind=db_engine, autoflush=False)

# 获取会话实例
db_session = SessionFactory()

数据模型定义

from sqlalchemy import Column, Integer, String, ForeignKey
from sqlalchemy.orm import relationship, declarative_base

Base = declarative_base()

class UserModel(Base):
    __tablename__ = 'users'
    
    id = Column(Integer, primary_key=True)
    name = Column(String(50), nullable=False)
    email = Column(String(100), unique=True)
    
    posts = relationship("BlogPost", back_populates="author")

class BlogPost(Base):
    __tablename__ = 'posts'
    
    id = Column(Integer, primary_key=True)
    title = Column(String(100), nullable=False)
    content = Column(String(500))
    author_id = Column(Integer, ForeignKey('users.id'))
    
    author = relationship("UserModel", back_populates="posts")
    tags = relationship("TagModel", secondary="post_tags", back_populates="posts")

class TagModel(Base):
    __tablename__ = 'tags'
    
    id = Column(Integer, primary_key=True)
    name = Column(String(30), unique=True)
    
    posts = relationship("BlogPost", 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)

表结构管理

# 创建表结构
Base.metadata.create_all(db_engine)

# 删除表结构
# Base.metadata.drop_all(db_engine)

基础CRUD操作

数据插入

new_user = UserModel(name="张三", email="zhangsan@example.com")
db_session.add(new_user)
db_session.commit()

batch_users = [
    UserModel(name="李四", email="lisi@example.com"),
    UserModel(name="王五", email="wangwu@example.com")
]
db_session.add_all(batch_users)
db_session.commit()

数据查询

all_users = db_session.query(UserModel).all()
first_user = db_session.query(UserModel).first()
user_by_id = db_session.get(UserModel, 1)

数据更新

target_user = db_session.query(UserModel).get(1)
target_user.name = "张三四"
db_session.commit()

db_session.query(UserModel).filter(UserModel.name.like("张%")).update(
    {"name": "张氏"}, synchronize_session=False
)
db_session.commit()

数据删除

target_user = db_session.query(UserModel).get(1)
db_session.delete(target_user)
db_session.commit()

db_session.query(UserModel).filter(UserModel.name == "李四").delete(
    synchronize_session=False
)
db_session.commit()

高级查询技术

查询优化

sorted_users = db_session.query(UserModel).order_by(UserModel.name.desc()).all()
limited_users = db_session.query(UserModel).limit(10).all()
offset_users = db_session.query(UserModel).offset(5).limit(10).all()

条件过滤

from sqlalchemy import or_

exact_match = db_session.query(UserModel).filter(UserModel.name == "张三").first()
pattern_match = db_session.query(UserModel).filter(UserModel.name.like("张%")).all()
in_clause = db_session.query(UserModel).filter(UserModel.name.in_(["张三", "李四"])).all()

聚合分析

from sqlalchemy import func

user_count = db_session.query(func.count(UserModel.id)).scalar()
grouped_data = db_session.query(
    UserModel.name, 
    func.count(BlogPost.id)
).join(BlogPost).group_by(UserModel.name).all()

关系操作实践

user = UserModel(name="赵六", email="zhaoliu@example.com")
post = BlogPost(title="初识SQLAlchemy", content="...", author=user)
db_session.add(post)
db_session.commit()

print(f"文章 '{post.title}' 的作者是 {post.author.name}")

post.tags.append(TagModel(name="Python"))
post.tags.append(TagModel(name="ORM"))
db_session.commit()

事务管理机制

try:
    user = UserModel(name="测试用户", email="test@example.com")
    db_session.add(user)
    db_session.commit()
except Exception as e:
    db_session.rollback()
    print(f"发生错误: {e}")

with db_session.begin_nested():
    user = UserModel(name="事务用户", email="transaction@example.com")
    db_session.add(user)

开发规范建议

  1. 采用依赖注入模式管理会话生命周期
  2. 实施严格的异常捕获与事务回滚策略
  3. 使用eager loading优化N+1查询问题
  4. 配置合理的连接池参数
  5. 在业务层实现数据完整性校验
@contextmanager
def get_db():
    session = SessionFactory()
    try:
        yield session
        session.commit()
    except Exception:
        session.rollback()
        raise
    finally:
        session.close()

with get_db() as db:
    user = UserModel(name="上下文用户", email="context@example.com")
    db.add(user)

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。