在构建需要与用户直接交互的系统时,长整型或UUID主键并不友好。很多团队希望在SQLAlchemy模型中为每条记录生成一个仅六位的唯一ID,用于订单号、邀请码等场景。下面介绍几种实用策略。

常见生成策略
随机字符串加唯一约束
最简单的方式是生成一个六位随机字符或数字,并在数据库层面对该列加唯一索引,插入时捕获重复异常重试。
- 优点:实现简单,不依赖额外组件
- 缺点:随着数据量增大,冲突概率上升,重试次数变多
序列与进制压缩
利用数据库序列产生自增值,再转为三十六进制等短表示形式,保证单调递增且长度可控。
Redis计数器
使用Redis的INCR生成全局数字,再格式化为六位,适合分布式高并发。
SQLAlchemy模型示例
以下代码演示随机六位数字配合唯一约束的方式:
from sqlalchemy import Column, Integer, String, create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
import random
Base = declarative_base()
class User(Base):
__tablename__ = 'user'
id = Column(Integer, primary_key=True)
# 六位数字短ID
short_id = Column(String(6), unique=True, nullable=False)
name = Column(String(50))
engine = create_engine('sqlite:///test.db')
Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)
def create_user(name):
session = Session()
for _ in range(10):
# 生成000000到999999之间的六位字符串
candidate = str(random.randint(0, 999999)).zfill(6)
try:
u = User(short_id=candidate, name=name)
session.add(u)
session.commit()
return u
except Exception:
session.rollback()
continue
raise RuntimeError('无法生成唯一六位ID')
print(create_user('张三').short_id)
避免冲突的建议
若采用随机方案,建议将候选字符集扩大为数字与字母组合,并将列设为unique=True。在高并发写入时,使用数据库事务与重试机制保障一致性。
短ID的本质是在可读性与唯一性之间做权衡,需根据业务规模选择生成方式。
总结
SQLAlchemy模型中生成唯一六位ID并不复杂,核心在于选择匹配业务的生成逻辑并辅以数据库唯一约束。小型应用可用随机重试,成长型业务建议引入序列或Redis方案。
SQLAlchemy唯一ID短ID生成修改时间:2026-07-28 00:36:19