
from sqlmodel import Session from config.database import engine from models.customers import customers def add_data(cust): with Session(engine) as session: session.add(cust) session.commit() session.refresh(cust) return cust前置知识SQLModel是基于 Pydantic SQLAlchemy 的 ORM用来操作数据库Session相当于数据库会话所有增删改查都通过会话完成。1. 导入部分python运行from sqlmodel import SessionSession数据库会话对象。相当于和数据库建立一次会话连接所有对象新增、修改、删除都要交给 Session 管理。会话会缓存对象只有 commit 之后才真正写入数据库。python运行from config.database import engineengine数据库引擎是 SQLModel/SQLAlchemy 的数据库底层连接对象封装数据库连接地址、驱动、连接池。config.database是项目下的模块里面一般类似python运行# config/database.py 示例 from sqlmodel import create_engine DATABASE_URL sqlite:///./test.db engine create_engine(DATABASE_URL)python运行from models.customers import customers导入模型customers这是 SQLModel 表模型类映射数据库里的 customers 数据表。cust参数就是这个类的实例对象代表一条待插入的客户记录。2. 函数定义python运行def add_data(cust):add_data(cust)新增一条客户数据的函数参数custcustomers模型的实例例如cust customers(name张三,phone138xxxx)3.with Session (engine) as session: 上下文管理器python运行with Session(engine) as session:with是 Python 上下文管理器使用engine引擎创建一个数据库会话sessionwith 块结束后自动关闭会话自动释放数据库连接不用手动写session.close()避免连接泄漏。整个数据库操作逻辑都放在这个 with 内部。⚠️重点session 只在 with 代码块内部有效出了 withsession 已经关闭对象会变成detached 游离状态。4.session.add(cust)python运行session.add(cust)session.add()把模型对象加入会话的待提交队列。✅此时没有访问数据库没有写入数据仅仅放到内存会话缓存。ORM 标记这个对象为pending待提交状态等待 commit。5.session.commit()python运行session.commit()真正向数据库执行INSERTSQL 语句把数据持久化存入数据库。提交事务。如果中间报错会自动回滚。commit 之后数据库生成自增主键 id但是内存里的 cust 对象此时还拿不到数据库生成的主键。坑点如果表有自增 IDcommit 之后 python 对象的 id 属性还是 None必须 refresh。6.session.refresh(cust)python运行session.refresh(cust)refresh从数据库重新查询这条记录把数据库最新状态同步回本地对象 cust。最主要用途拿到数据库自动生成字段自增主键 id、默认值、数据库时间戳。底层等价执行一条SELECT * FROM customers WHERE id刚插入的主键。注意refresh()必须在 session 没有关闭的时候调用必须写在 with 块里面如果写在 with 外面 session 已经关闭会直接抛异常。7.return custpython运行return cust返回已经同步数据库状态的模型对象。此时对象上已经携带数据库生成的 id 等字段调用方拿到就可以直接读取主键。完整调用示例python运行# 创建模型实例 new_cust customers(name李四, phone13900001111) res add_data(new_cust) print(res.id) # commitrefresh之后才有数据库自增id潜在问题 优化建议问题 1没有异常捕获当前代码报错会直接抛出异常事务不会回滚。建议加上 try‑exceptpython运行def add_data(cust): with Session(engine) as session: try: session.add(cust) session.commit() session.refresh(cust) return cust except Exception as e: session.rollback() #出错回滚事务 raise e问题 2customers命名建议按照 Python 规范类名用大驼峰建议改成Customers小写一般用于表变量。区分 3 个关键方法对比表格方法作用是否访问数据库session.add(obj)加入会话缓存标记待插入❌内存操作session.commit()提交事务执行 insert 写入 DB✅访问数据库session.refresh(obj)回查数据库同步数据到对象✅执行 SELECT 查询重要坑提醒refresh()不能放到with外面出了 with 会话关闭直接报错。如果不写 refresh返回的 cust 拿不到自增主键 id。with 退出自动 close 会话不需要手动 close。commit 之后对象才真正写入数据库程序崩溃在 commit 之前数据不会落库。补充SQLModel 还有一个简写方式session.exec()/session.get()另外 SQLModel 还提供session.add_and_commit()封装但底层逻辑和上面代码完全一样。