0%

SQLModel自学教程(6) - 数据插入操作

1.数据插入核心流程

graph TD
    A[创建模型实例] --> B[打开Session会话]
    B --> C[添加实例到Session]
    C --> D[提交事务]
    D --> E[刷新对象状态]
  • 使用SQLAlchemy会话管理数据库操作
  • 通过session.add()批量添加多个对象

2.基础插入操作

1
2
3
4
5
6
7
8
9
10
11
from sqlmodel import Session, SQLModel

# 创建英雄实例
hero_1 = Hero(name="Deadpond", secret_name="Dive Wilson")
hero_2 = Hero(name="Spider-Boy", secret_name="Pedro Parqueador")

with Session(engine) as session:
session.add(hero_1)
session.add(hero_2)
session.commit()
session.refresh(hero_1) # 获取数据库生成的ID

关键步骤说明

  • session.add() 将对象添加到待提交队列
  • session.commit() 执行实际数据库写入
  • session.refresh() 更新对象状态(如自增ID)

3.批量插入优化

1
2
3
4
5
6
7
8
9
# 批量添加示例
heroes = [
Hero(name="Rusty-Man", secret_name="Tommy Sharp", age=48),
Hero(name="Batman", secret_name="Bruce Wayne")
]

with Session(engine) as session:
session.add_all(heroes)
session.commit()
  • 使用add_all()提升批量插入效率
  • 建议每500-1000条记录提交一次事务

4.关联数据插入

1
2
3
4
5
6
7
8
9
# 创建团队与英雄关联
team_z = Team(name="Z-Force", headquarters="Sister Margaret's Bar")
hero = Hero(name="Deadpond", team_id=team_z.id)

with Session(engine) as session:
session.add(team_z)
session.commit() # 先提交团队获取ID
session.add(hero)
session.commit()
  • 外键关联需确保父对象已持久化
  • 推荐使用数据库级联操作替代手动ID管理

5.数据验证机制

1
2
3
4
5
from sqlmodel import Field

class Hero(SQLModel, table=True):
name: str = Field(nullable=False, unique=True)
age: int | None = Field(ge=0, le=150)
  • 字段级验证(非空、唯一性等)
  • 类型注解自动执行数据验证
  • 自定义校验可通过@validator装饰器实现

6.错误处理实践

1
2
3
4
5
6
7
8
try:
session.commit()
except IntegrityError:
session.rollback()
print("唯一性约束冲突!")
except SQLAlchemyError as e:
session.rollback()
print(f"数据库错误:{str(e)}")
  • 必须的事务回滚操作
  • 常见错误类型处理

提示:完整示例代码建议参考官方文档 ,生产环境推荐结合异步会话提升性能