【SQLAlchemy】第8节:Session会话入门
1. 啥是会话
会话相当于一个工厂,比如说多个模型类进行修改的操作,一旦有一个出现异常,那么要集体回滚,这个所谓的集体(就是这多个模型类)他们在这一次保存操作中,必须关联起来,才能做到要成功一起成,要滚一起滚,会话,就是一个把他们建立联系的那个工厂。
当然工厂的用途不仅仅是这么点,关系查询,懒加载,在SQLAlchemy中都必须依赖会话。
2. 创建会话的步骤
# Session依赖engine,所以需要预先创建,
from sqlalchemy import create_engine
engine = create_engine(
'mysql+pymysql://root:12345@localhost:3306/tor1',
echo=False
)
# ----------------------------------------
# 1. 导入sessionmaker(用于创建Session)
from sqlalchemy.orm import sessionmaker
# 2. 两周创建Session的方式,只是使用engine的时候不同
# 2.1 第一种方式
Session = sessionmaker(bind=engine) # 注意,Session是一个为实例化的Class对象
session = Session() # 实例化session
# 2.2 第二种方式
Session = sessionmaker() # 先创建一个为实例化的Session类对象
session = Session(bind=engine) # 实例化的时候再加入engine
这两种写法的好处:
- SQLAlchemy是企业级的ORM框架,engine可以在不同时候动态加入,会提高开发者的灵活性,因为毕竟对于大项目,在众多的功能与高度模块化的前提下,真正的解耦是一件不容易的事情
3. 保存与修改模型对象
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, String, Integer
from sqlalchemy.orm import sessionmaker
engine = create_engine( # 定义引擎
'mysql+pymysql://root:12345@localhost:3306/tor1',
echo=False
)
Base = declarative_base() # 基类
class User(Base): # 定义用户类
__tablename__ = 'user'
id = Column(Integer, primary_key=True)
name = Column(String(16))
def __repr__(self): # 打印User对象的时候,输出这个对象中保存的用户名
return self.name.__str__()
Base.metadata.create_all(engine) # 创建User对象
1.创建session会话
Session = sessionmaker()
session = Session(bind=engine)
2.实例化一个User对象,name="name1"
user1 = User(name='name1') # 实例化一个User对象
print(user1.id) # --> None
对象没有写进数据库,所以id为None
3. 把user1添加到session工厂中,并提交
session.add(user1) # 会话工厂中添加了user1
session.commit() # 提交,与数据库发生交互
print(user1.id) # --> 1,返回user1对象写入数据库,为其生成的id
关键字 | 解释 |
---|---|
add(object) | 添加一个 |
add_all([object,…]) | 添加多个 |
commit() | 提交事务 |
把user1对象保存到数据库之后,user1会维护id为此次插入数据库中的id
4. 修改user1的name
user1.name='name1_new'
session.add(user1)
session.commit()
如果提交的user对象中有id,那么执行的不是insert,而是update
相当于:update user set name=‘name1_new’ where id = 1;
5. 执行完毕,关闭session
session.close()
4. 查询模型对象(后续详细讲)
1.查询user表中所有的数据,并以User类对象的方式作为结果显示
users = session.query(User).all()
for user in users:
print(user.name)
返回的结果是列表:[User,User,…]
2.查询user表中指定的数据
user = session.query(User).filter_by(id=1).first()
print(user.name)
返回id=1的User‘对象