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)
|
关键步骤说明:
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() 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)}")
|
提示:完整示例代码建议参考官方文档 ,生产环境推荐结合异步会话提升性能