【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‘对象

猜你喜欢

转载自blog.csdn.net/kzl_knight/article/details/103166585
今日推荐