
在 SQLAlchemy ORM 中,使用 Mapped[str] 默认生成无长度限制的 VARCHAR 类型;若需定义固定长度(如 MD5 哈希对应的 16 字节),应显式传入 String(N) 作为 mapped_column 的类型参数。
在 sqlalchemy orm 中,使用 `mapped[str]` 默认生成无长度限制的 varchar 类型;若需定义固定长度(如 md5 哈希对应的 16 字节),应显式传入 `string(n)` 作为 `mapped_column` 的类型参数。
在现代 SQLAlchemy(2.0+)中,Mapped 类型注解仅用于声明 Python 类型,不携带数据库类型语义。因此,即使你将字段标注为 Mapped[str],SQLAlchemy 仍需通过 mapped_column() 显式指定底层 SQL 类型及其约束——包括长度。
以 html_div_md5 字段为例:MD5 哈希值经二进制表示为 16 字节(128 位),若以 BYTEA(PostgreSQL)或 BINARY(16)(MySQL/SQL Server)存储最为精准;但若采用十六进制字符串形式(如 'd41d8cd98f00b204e9800998ecf8427e'),则长度为 32 个 ASCII 字符,此时应使用 String(32)。务必根据实际存储格式选择长度。
✅ 正确做法(推荐十六进制字符串 + 显式长度):
from sqlalchemy import String
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
class MyBase(DeclarativeBase):
pass
class HtmlData(MyBase):
__tablename__ = 'html_data_table_name'
html_id: Mapped[int] = mapped_column(primary_key=True)
html_div: Mapped[str] # 默认 → VARCHAR (length unbounded)
html_div_md5: Mapped[str] = mapped_column(String(32)) # ✅ 固定 32 字符
⚠️ 注意事项:
-
String(16)表示 最多 16 个字符(非字节),适用于 ASCII/UTF-8 字符串;若存二进制哈希,应改用LargeBinary(16)或BINARY(16)(需数据库支持); - 不同数据库对
VARCHAR(N)的实现略有差异(如 MySQL 中utf8mb4下String(16)最多占 64 字节),但长度约束本身仍有效; -
create_all()将据此生成带长度声明的 DDL,例如:html_div_md5 VARCHAR(32) NOT NULL; - 若后续需迁移已有无约束字段,须配合 Alembic 手动编写
alter_column(type_=String(32))指令。
总结:Mapped[str] 仅表意,mapped_column(String(N)) 才是控制数据库列长度的关键。合理设置长度不仅能节省存储、提升索引效率,更是数据完整性的重要保障。










