SQLAlchemy ORM模型:字段类型、约束与数据操作详解
SQLAlchemy作为Python生态中最强大的ORM工具之一,为开发者提供了高效便捷的数据库操作方式。本文将详细介绍SQLAlchemy ORM模型中的字段类型、字段约束以及基础数据操作,助您快速掌握核心用法。
一、字段类型详解
SQLAlchemy提供了丰富的字段类型,下表展示了常用类型及其对应的Python数据类型:
ORM字段类型 | Python类型 | 描述 |
---|---|---|
Integer | int |
32位普通整数 |
SmallInteger | int |
16位小整数 |
BigInteger | int |
不限制精度的大整数(替代Integer) |
Float | float |
浮点数 |
Numeric | decimal.Decimal |
高精度定点数 |
String | str |
变长字符串(需指定长度,如String(20) ) |
Text | str |
不限长度的文本类型 |
Boolean | bool |
布尔值(True/False) |
DateTime | datetime.datetime |
日期时间类型 |
Date | datetime.date |
日期类型 |
Time | datetime.time |
时间类型 |
Enum | enum.Enum |
枚举类型(需配合Enum 类使用) |
关键类型说明:
• String vs Text:String
必须指定最大长度,适用于短文本;Text
适用于长文本内容。
• 数值类型选择:根据数据范围选择SmallInteger
(-32768~32767)、Integer
或BigInteger
。
• 时间类型:DateTime
精确到秒级,如需更高精度可使用DateTime(timezone=True)
。
二、字段约束配置
通过字段约束可定义数据校验规则,常用选项如下:
约束选项 | 说明 |
---|---|
primary_key=True |
设置为主键 |
unique=True |
唯一约束(列值不可重复) |
index=True |
创建索引(提升查询效率) |
nullable=False |
非空约束(默认允许NULL) |
default=值 |
默认值(支持函数如datetime.now ) |
示例模型定义
from datetime import datetime
from sqlalchemy import Column, Integer, String, Text, Boolean, DateTime
class Student(db.Model):
__tablename__ = 'tb_student'
id = Column(Integer, primary_key=True)
name = Column(String(20), nullable=False)
sex = Column(Boolean, default=True)
classes = Column('class', SmallInteger) # 数据库字段名为class
description = Column(Text)
addtime = Column(DateTime, default=datetime.now)
三、数据操作指南
1. 添加数据
添加单条数据
student = Student(
name="小明",
classes=305,
sex=True,
age=18,
description="新生入学"
)
db.session.add(student) # 添加至会话
db.session.commit() # 提交事务
批量添加数据
students = [
Student(name="张三", classes=302),
Student(name="李四", classes=303),
Student(name="王五", classes=304)
]
db.session.add_all(students)
db.session.commit()
2. 查询数据
查询单条记录
# 通过主键查询
student = db.session.query(Student).get(1)
print(student.name) # 输出:小明
# 使用first获取第一条记录
student = db.session.query(Student).filter_by(classes=305).first()
查询多条记录
# 查询所有学生
students = db.session.query(Student).all()
for stu in students:
print(f"{stu.id}: {stu.name} - {stu.classes}班")
# 条件查询(后续文章详解)
result = db.session.query(Student).filter(Student.age > 16).all()
3. 更新与删除
(注:示例代码需在后续补充)
四、最佳实践与注意事项
- 会话管理:确保在操作后调用
commit()
提交事务,异常时使用rollback()
回滚。 - 模型设计:合理选择字段类型,如手机号建议使用
String(11)
而非Integer
。 - 索引优化:对高频查询字段添加
index=True
提升性能。 - 时间字段:使用
default=datetime.now
自动记录创建时间。
参考资源
• SQLAlchemy官方文档
• Flask-SQLAlchemy扩展指南
通过掌握这些核心概念,您已经能够使用SQLAlchemy进行基础的数据库操作。接下来可深入学习关系映射、复杂查询和性能优化等高级主题。