字段类型

SQLAlchemy 的字段类型对应 Python 类型和数据库类型,选对类型是建表的第一步。

一、常用类型速查表

SQLAlchemy 类型Python 类型MySQLPostgreSQLSQLite
IntegerintINTINTEGERINTEGER
BigIntegerintBIGINTBIGINTINTEGER
SmallIntegerintSMALLINTSMALLINTINTEGER
FloatfloatFLOATFLOATREAL
Numeric(precision, scale)DecimalDECIMAL(10,2)NUMERIC(10,2)REAL
String(N)strVARCHAR(N)VARCHAR(N)VARCHAR(N)
TextstrTEXTTEXTTEXT
BooleanboolTINYINTBOOLEANINTEGER
DatedateDATEDATEDATE
DateTimedatetimeDATETIMETIMESTAMPVARCHAR
TimetimeTIMETIMEVARCHAR
LargeBinarybytesBLOBBYTEABLOB
JSONdict/listJSONJSONBTEXT
Enumstr/enumENUMVARCHARVARCHAR

二、逐个讲解

1. String(N) — 字符串

from sqlalchemy import String

name = Column(String(50))    # 最大 50 个字符
  • 必须指定长度 N,数据库会限制最大长度
  • 如果内容不确定长度,用 Text 代替

2. Text — 长文本

from sqlalchemy import Text

content = Column(Text)       # 不限长度的大文本
  • 适合文章内容、评论、日志等长文本
  • MySQL 对应 TEXT,PostgreSQL 对应 TEXT

3. Integer / BigInteger / SmallInteger — 整数

from sqlalchemy import Integer, BigInteger, SmallInteger

age    = Column(Integer)       # 普通整数(最常用)
views  = Column(BigInteger)    # 大整数,如浏览量、计数器
status = Column(SmallInteger)  # 小整数,如状态码 0/1/2
  • Integer 范围:-2147483648 ~ 2147483647
  • BigInteger 范围:约 ±9.2 × 10¹⁸
  • SmallInteger 范围:-32768 ~ 32767

4. Float / Numeric — 小数

from sqlalchemy import Float, Numeric

score     = Column(Float)              # 浮点数,有精度误差
price     = Column(Numeric(10, 2))     # 精确小数,总长10位,小数2位
  • Float:计算快但有精度误差,适合分数、概率等
  • Numeric:精确无误差,适合金额、价格等必须精确的场景

5. Boolean — 布尔

from sqlalchemy import Boolean

is_active = Column(Boolean, default=True)
  • Python 端用 True / False
  • MySQL 底层存为 TINYINT(1),SQLite 存为 INTEGER

6. Date / DateTime / Time — 日期时间

from sqlalchemy import Date, DateTime, Time
from datetime import datetime, date

birthday    = Column(Date)                              # 只有日期
created_at  = Column(DateTime, default=datetime.now)    # 日期 + 时间
start_time  = Column(Time)                              # 只有时间
  • Date:Python 的 date 对象
  • DateTime:Python 的 datetime 对象(最常用)
  • Time:Python 的 time 对象

7. JSON — JSON 数据

from sqlalchemy import JSON

extra_info = Column(JSON)      # 存储任意 JSON 对象
tags       = Column(JSON)      # 存储数组也行
  • MySQL 对应 JSON 类型,PostgreSQL 对应 JSONB(更快)
  • SQLite 底层存为 TEXT,靠 SQLAlchemy 做序列化/反序列化
  • 适合存配置、标签、扩展字段等结构不固定的数据

8. Enum — 枚举

from sqlalchemy import Enum
import enum

class GenderEnum(enum.Enum):
    male   = "male"
    female = "female"

gender = Column(Enum(GenderEnum))
  • 限定字段只能存预定义的值
  • MySQL 底层用真正的 ENUM 类型,PostgreSQL/SQLite 用 VARCHAR + CHECK 约束

9. LargeBinary — 二进制

from sqlalchemy import LargeBinary

avatar = Column(LargeBinary)   # 存图片、文件等二进制数据
  • 一般不建议直接把文件存数据库,存文件路径更常见
  • 适合存加密密钥、序列化对象等小型二进制数据