
前一章用SQL表达式(SQL Express)语法操作数据库时,仍然侧重于从Core API的角度来看 SQL表达式语言,主要目的是通过封装的SQL表达式来实现跨不同数据库目的。
本章主要介绍ORM API 基础知识、实现ORM CRUD 基础操作。我尽可能使用简洁的语言,配合实例代码,帮助你尽快上手。下一章将深入学习ORM API的主要方法、使用方式,以及较复杂需求的编程实现。
1、ORM 原理
在第1章介绍过ORM原理时。 Python类对象通过ORM与数据库Table进行映射,通过Python类对象的方式来操作数据库。开发人员无须再使用各类数据库的接口API,以及SQL语法,

注: ORM的理想很丰满,现实却是这样的:用好ORM还是需要扎实的SQL基础才能用好。
ORM如何实现从Python对象到数据库的映射呢?
- 这种映射结构可分为如下几层
- Python Table类: 将 Database 的表结构 => 表示为 Python Metadata, 数据库字段 => 表示为Python Table类的属性(Column对象)
- Python Table类的1个实例对象(object),相当于数据库的1行记录,对象列表表示多行记录。
- 数据库操作的ORM实现
- 插入1行数据,就相当于: 新建1个Python类实例对象,通过ORM插入数据库
- 通过ORM查询数据库,返回值为Python对象列表
- 数据库查询结果,用对象列表方式呈现
2、ORM基础编程步骤
2.1 ORM API的使用步骤:
预备知识:
metadata:
上一章已详细介绍过,用于保存表结构, 通常1个应用定义1个全局metadata对象, 集中保存表结构。
declarative Table 声明式Table类
将数据库的表、字段,定义成Python类与属性的结构,这种结构称为声明式映射(Declarative Mapping)。Sqlalchemy2以后。table 类必须继承自 DeclarativeBase。
ORM API的使用流程:
(1)定义1个DeclarativeBase子类,做为Python table类的父类
(2)定义映射table类,映射到1个数据库表
(3)通过engine在数据库中实际创建表。 由Base.metadata向engine 发关create table DDL的事件.
(4) 创建Session对象,连接到engine,用于管理后续数据库操作。
(5) ORM对数据的增删改查操作,与Core API 有明显不同。 ORM的添加、修改、删除操作是通过Session来操作映射Table类的对象来完成。ORM查询使用的 select()方法也对 SQL表达式做了进一步封装,输入是以映射Table对象,而非metadata 的table类。
(6) Session对象支持transaction事务操作, 执行commit() 提交事务,rollback() 回滚当前事务,
说明:此处提到的 table 类,是为了描述方便,此类用于映射数据库表,不是上一节提到的sqlalchemy.Table 内置类。
2.2 声明式映射语法定义Table类与Column类
SqlAlchemy 提供了两种ORM映射方式定义映射类: 经典式Imperative Mapping, 声明式Declarative Mapping。尔后第3节会详细介绍。
1) 申明式定义table 类
继承自DeclarativeBase, column 字段定义遵照mapping 语法
定义1个Base做为Table类的基类
from sqlalchemy.orm import DeclarativeBase
class Base(DeclarativeBase):
pass
注:Base对象包含metadfata. registry 属性
Base.metadata
Base.registry
设置数据库表名
__tablename__ = "user_account" , 设置为db table 名
定义column属性,
name: Mapped[str] = mapped_column(String(30))
等号左边使用type notation注明Python类型,右边用mapped_column()给出最匹配的Database字段类型
这是SqlAlchemy2.0推荐的方式,别嫌麻烦,这样做可以大大减少数据库迁移时出错的概率,
下面是1个用声明式映射方式定义的Person 类。
from sqlalchemy.orm import DeclarativeBase, Session
from sqlalchemy.orm import Mapped, mapped_column
from sqlalchemy import String, Integer
class Base(DeclarativeBase):
pass
class Person(Base):
__tablename__ = 'person'
id: Mapped[int] = mapped_column(primary_key=True)
name: Mapped[str] = mapped_column(String(30))
age: Mapped[int] = mapped_column(Integer)
def __init__(self, name: str, age: int):
self.name = name
self.age = age
def __repr__(self):
return f"Person({
self.name}, {
self.age})"
说明:
上述模型类,除将用属性映射到数据库字段外,与普通类定义一样,也提供了对象初始化方法__init__(),以及__r

本文详细介绍了如何使用SqlAlchemy的ORMAPI进行数据库操作,包括ORM原理、基本编程步骤(如创建Table类、映射字段、数据插入、查询、更新和删除)、字段映射实现原理以及自定义映射和使用Enum。
最低0.47元/天 解锁文章
1750

被折叠的 条评论
为什么被折叠?



