SQLAlchemy教程:第一个例子-2.ORM基类、表模型定义

介绍

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="密码")

原文出处:/show_1GW3sCi52YhG.html