Python SQLAlchemy ORM:从Mapping到Declarative的演进

南乔
南乔
发布时间:2026-10-13| 6人浏览过
原创

本文深入解析Python SQLAlchemy中ORM映射的两种实现方式。首先介绍传统的mapper函数映射机制,通过定义Table、类及mapper关联实现对象与数据表对应;随后重点讲解Declarative声明式系统,展示如何继承Base类简化映射配置。通过对比两种方式的代码结构,帮助开发者理解ORM底层原理并选择合适方案。

SQLAlchemy ORM映射概述

前文曾介绍过SQLAlchemy中的Engine和Connection对象,它们主要用于处理原生SQL语句。而ORM(Object Relational Mapper,对象关系映射)则提供了一种面向对象的操作数据库表数据的技术思路。简而言之,ORM建立了Python对象与数据库表之间的映射关系。

在早期的SQLAlchemy版本中,Python对象与数据库中每条记录的映射是通过一个特定的mapping函数来实现的。

传统Mapping函数映射机制

首先通过一个具体示例来展示这一过程:


from sqlalchemy import Table, MetaData, Column, Integer, String,
from sqlalchemy.orm import mapper

# 数据库的元数据,你可以认为它是一个容器,装载了所有的表结构
metadata = MetaData()

# 数据库中的news_article表
article = Table("news_article", metadata,
        Column("id", Integer, primary_key=True),
        Column("title", String)
        )

# 这是一个普通的Article类
class Article:
  def __init__(self, title):
    self.title = title

# 通过mapper函数进行映射关联
mapper(Article, article)

完成映射关联后,实际使用方式如下例所示:


from sqlalchemy.orm import sessionmaker
Session = sessionmaker(bind=engine)
session = Session()
# 通过Artcile类来查询id==4554的记录,这完全是用面向对象的方式执行sql了
# 返回结果就是Article的实例对象
result = session.query(Article).filter(Article.id==4554).first()
print(result.id) # 4554
print(result.title) # xxxxxxxxx

经过mapper函数映射后,通过query查询返回的结果会自动构建为一个Article对象,并具备id属性。这正是ORM技术的核心优势所在。

Declarative声明式系统

而新版ORM映射不再需要手动使用mapping函数来关联Table与类之间的关系,可以直接通过声明(Declarative)系统来定义类。该类直接映射到数据库表,Declarative将Table、mapper以及类三者整合在一起进行声明,从而实现了ORM映射。具体示例如下:


from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

class Article(Base):
  __tablename__ = 'news_article'
  id = Column(Integer, primary_key=True)
  title = Column(String(50))

这种方式是否更加简洁?不再需要单独定义Table,也无需调用mapper函数,仅需定义一个继承自基类Base的类即可。Base即为声明系统,由此完成了Table与类之间的映射关系,其背后的操作均由declarative_base工厂方法构造的声明系统自动完成。

我们将此类称为映射类,它持有对Table和mapper函数的引用。


>>> print(Article.__table__)
news_article

>>>print(Article.__mapper__)
Mapper|Article|news_article

# 前面将的metadata 可以通过 Base 获取
>>>print(Base.metadata)
MetaData(bind=None)

MetaData的作用

那么MetaData的作用是什么?可以通过它来创建或删除数据库表。

以上即为本文的全部内容,希望这对大家的学习有所帮助,同时也欢迎大家继续支持本站。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。