介绍
ORM是将类与表一一对应,也就是用面向对象的思想去操作表,所以要定义基类、表模型类
ORM基类
如果表中有通用的字段,就放到基类中,没有就定义为空类
实现基类
导包
from sqlalchemy import String, Integer
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
基类
class Base(DeclarativeBase):
pass
表模型类
表模型类,就是与 表 一一对应的类,该类继承 ORM基类
组成
__tablename__赋值为表名- 属性要与表中字段一一对应,类型是
Mapped[],默认值是mapped_column()
mapped_column()常用形参
Mapped[int] = mapped_column(
name,
type,
primary_key=True,
autoincrement=True,
index=True,
nullable=False,
unique=False,
comment="主键ID"
)
解释
- name:表中的字段名,不传值取表模型类的属性名
- type:表中的类型,详见下表
- primary_key:
bool类型,默认False。是否作为主键。 - autoincrement:
bool | "auto"。默认"auto",MySQL 整数主键开启AUTO_INCREMENT自增。 - nullable:
bool,默认True。是否允许NULL。nullable=False表示NOT NULL。 - unique:
bool,默认False。该字段建立 唯一约束,字段值不能重复。 - index:
bool,默认False。是否给该字段创建普通索引 - comment:字符串类型,字段注释,MySQL 建表生成 COMMENT。
type取值:
| Python类型注解 | SQLAlchemy类型 | MySQL实际类型 | 说明 |
|---|---|---|---|
Mapped[int] |
Integer() |
int | 普通整数,约 ±21亿 |
Mapped[int] |
BigInteger() |
bigint | 大整数,雪花id用 |
Mapped[str] |
String(64) |
varchar(64) | 短字符串,必须写长度 |
Mapped[str] |
Text() |
longtext | 大文本,不需要长度 |
Mapped[float] |
Float() |
float | 浮点数,精度不高,金额不要用 |
Mapped[Decimal] |
Numeric(10,2) |
decimal(10,2) | 金额,精确小数;总长度10,小数位2 |
Mapped[bool] |
Boolean() |
tinyint(1) | mysql没有bool,底层tinyint 0/1 |
Mapped[date] |
Date() |
date | 日期 yyyy‑MM‑dd |
Mapped[datetime] |
DateTime() |
datetime | 日期时间 |
Mapped[bytes] |
LargeBinary() |
longblob | 二进制字节 |
实现:定义表模型类
class User(Base):
__tablename__ = "user"
id: Mapped[int] = mapped_column(Integer(),primary_key=True,autoincrement=True,comment="主键")
username: Mapped[str] = mapped_column(String(50),comment="")
password: Mapped[int] = mapped_column(String(50),comment="密码")