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

Python ORM开发实战:SQLAlchemy数据库操作指南

访客 技术 2026年6月24日 1

安装配置

执行以下命令安装核心库:

pip install sqlalchemy

数据库驱动按需安装:

# PostgreSQL适配器
pip install psycopg2

# MySQL连接器
pip install mysqlclient

核心组件

  • 数据库引擎:管理底层连接池
  • 会话对象:操作原子性控制单元
  • 模型类:表结构的Python映射

数据库连接

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker

# 初始化SQLite引擎
db_engine = create_engine('sqlite:///data.db', echo=False)

# 配置会话工厂
SessionFactory = sessionmaker(bind=db_engine, autocommit=False)
current_session = SessionFactory()

模型定义

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

ModelBase = declarative_base()

class Employee(ModelBase):
    __tablename__ = 'employees'
    
    employee_id = Column(Integer, primary_key=True)
    full_name = Column(String(50))
    contact_email = Column(String(100), unique=True)
    
    assignments = relationship("Task", back_populates="owner")

class Task(ModelBase):
    __tablename__ = 'tasks'
    
    task_id = Column(Integer, primary_key=True)
    task_title = Column(String(100))
    owner_id = Column(Integer, ForeignKey('employees.employee_id'))
    
    owner = relationship("Employee", back_populates="assignments")
    
    labels = relationship("Tag", secondary="task_labels", back_populates="tasks")

# 多对多关联表
class TaskLabel(ModelBase):
    __tablename__ = 'task_labels'
    
    task_ref = Column(Integer, ForeignKey('tasks.task_id'), primary_key=True)
    tag_ref = Column(Integer, ForeignKey('tags.tag_id'), primary_key=True)

表结构生成

# 创建所有模型对应的表
ModelBase.metadata.create_all(bind=db_engine)

数据操作

新增记录

new_employee = Employee(full_name="陈明", contact_email="chen@domain.com")
current_session.add(new_employee)
current_session.commit()

查询记录

# 条件过滤
employee = current_session.query(Employee).filter_by(full_name="陈明").first()

# 关联查询
results = current_session.query(Employee, Task).join(Task).all()

更新记录

employee.contact_email = "new_email@domain.com"
current_session.commit()

删除记录

current_session.delete(employee)
current_session.commit()

高级查询

from sqlalchemy import func, or_

# 聚合统计
task_count = current_session.query(func.count(Task.task_id)).scalar()

# 多条件筛选
employees = current_session.query(Employee).filter(
    or_(Employee.full_name.like("陈%"), 
        Employee.contact_email.contains("domain"))
).limit(5).all()

关系管理

# 添加关联对象
dev_tag = Tag(name="开发")
new_task = Task(task_title="API优化", owner=new_employee)
new_task.labels.append(dev_tag)
current_session.commit()

事务控制

try:
    emp = Employee(full_name="测试员工", contact_email="test@test.com")
    current_session.add(emp)
    current_session.commit()
except Exception:
    current_session.rollback()
    raise

优化实践

  • 使用会话上下文管理资源
  • 预加载关联对象避免N+1查询
  • 设置连接池超时参数
from contextlib import contextmanager

@contextmanager
def db_session():
    session = SessionFactory()
    try:
        yield session
        session.commit()
    except:
        session.rollback()
        raise
    finally:
        session.close()

相关文章

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...

发表评论

访客

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