python sqlalchemy db.session 的commit()和colse()对session中的对象的影响

实验一:commit()之后查看stu的属性id,查看db.session是否改变

@db_test.route("/db_test",methods=["GET"])
def db_test():
    stu=StuTest()
    stu.stu_age=22
    stu.stu_name="nnannns"
    stu.stu_class=11
    print("session1:",id(db.session))
    print("--------11111:",stu in db.session)
    db.session.add(stu)
    print("--------22222:",stu in db.session)
    db.session.commit()
    print("id=",stu.id)
    print("session2:",id(db.session))
    print("--------33333:",stu in db.session)
    return "hello"

结果: 

session1: 2205376105296
--------11111: False
--------22222: True
id= 33
session2: 2205376105296
--------33333: True

结论:commit之后db.session对象仍然存在,并且stu对象仍然在db.session中。 

实验二:close()之后查看stu的属性id,查看db.session是否改变 

@db_test.route("/db_test",methods=["GET"])
def db_test():
    stu=StuTest()
    stu.stu_age=22
    stu.stu_name="nnannns"
    stu.stu_class=11
    print("session1:",id(db.session))
    print("--------11111:",stu in db.session)
    db.session.add(stu)
    print("--------22222:",stu in db.session)
    db.session.commit()
    db.session.close()
    print("id=",stu.id)
    print("session2:",id(db.session))
    print("--------33333:",stu in db.session)
    return "hello"

 结果:

session1: 2666995239888
--------11111: False
--------22222: True

 raise orm_exc.DetachedInstanceError(
sqlalchemy.orm.exc.DetachedInstanceError: Instance <StuTest at 0x26cf89568d0> is not bound to a Session; attribute refresh operation cannot proceed (Background on this error at: http://sqlalche.me/e/14/bhk3)

结论:close()之后会清除session中的已存在对象。

为了查看是否会清除session,暂时先将stu.id取值去掉

@db_test.route("/db_test",methods=["GET"])
def db_test():
    stu=StuTest()
    stu.stu_age=22
    stu.stu_name="nnannns"
    stu.stu_class=11
    print("session1:",id(db.session))
    print("--------11111:",stu in db.session)
    db.session.add(stu)
    print("--------22222:",stu in db.session)
    db.session.commit()
    db.session.close()
    print("session2:",id(db.session))
    print("--------33333:",stu in db.session)
    return "hello"

 结果:

session1: 2704349383504
--------11111: False
--------22222: True
session2: 2704349383504
--------33333: False

结论:close()并不会销毁session,而是清除之内的实例对象。 

实现三:db.create_scoped_session()创建新的session

@db_test.route("/db_test",methods=["GET"])
def db_test():
    stu=StuTest()
    stu.stu_age=22
    stu.stu_name="nnannns"
    stu.stu_class=11
    print("session1:",id(db.session))
    print("--------11111:",stu in db.session)
    db.session.add(stu)
    print("--------22222:",stu in db.session)
    db.session.commit()
    print("id=",stu.id)
    print("session2:",id(db.session))
    print("--------33333:",stu in db.session)
    db.session = db.create_scoped_session()
    print("--------44444:",stu in db.session)
    print("session3:",id(db.session))
    return "hello"

 session1: 2259114183632
--------11111: False
--------22222: True
id= 39
session2: 2259114183632
--------33333: True
--------44444: False
session3: 2259147304080

db.create_scoped_session()会创建新的session 

实验室四,新的session创建后,还能读到原来的对象及其属性吗?

@db_test.route("/db_test",methods=["GET"])
def db_test():
    stu=StuTest()
    stu.stu_age=22
    stu.stu_name="nnannns"
    stu.stu_class=11
    print("session1:",id(db.session))
    print("--------11111:",stu in db.session)
    db.session.add(stu)
    print("111 stu id:",id(stu))
    print("--------22222:",stu in db.session)
    db.session.commit()
    print("111 id=",stu.id)
    print("session2:",id(db.session))
    print("--------33333:",stu in db.session)
    db.session = db.create_scoped_session()
    print("--------44444:",stu in db.session)
    print("session3:",id(db.session))
    print("222 id=",stu.id)
    print("222 stu id:",id(stu))
    print("--------55555:",stu in db.session)
    return "hello"

打印:

session1: 2131572083344
--------11111: False
111 stu id: 2131571801616
--------22222: True
111 id= 45
session2: 2131572083344
--------33333: True
--------44444: False
session3: 2131605649744
222 id= 45
222 stu id: 2131571801616
--------55555: False 

结论:虽然生成了新的session,但是stu实例对象还是存在的,但是不存在session中了。还是能读到stu.id的。

到这里已经不明白了,有大神能解释这个原理吗?求解释。。。 

python sqlachemy的session可以查看这个:https://www.cnblogs.com/ChangAn223/p/11277468.html#%E4%BA%8C%E5%8D%95%E7%BA%BF%E7%A8%8B%E4%B8%8B-scoped_session-%E5%AF%B9%E5%88%9B%E5%BB%BA-session-%E7%9A%84%E5%BD%B1%E5%93%8D

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`db.session.rollback()` 是 Flask-SQLAlchemy 提供的一个方法,用于回滚当前数据库会话的所有未提交的更改。 当使用 SQLAlchemy 进行数据库操作时,通常会在一个会话(session进行多个数据库操作,比如插入、更新、删除等。在执行这些操作过程,如果出现错误或者需要取消之前的更改,可以使用 `db.session.rollback()` 方法来回滚到之前的状态。 具体来说,`db.session.rollback()` 方法会撤销当前会话的所有未提交的更改,包括添加的新对象、更新的对象和删除的对象。它会将数据库会话重置为最近一次提交之前的状态。 使用示例: ```python from flask import Flask from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'your_database_uri' db = SQLAlchemy(app) @app.route('/') def index(): try: # 执行一些数据库操作 # ... db.session.commit() # 提交更改 except: db.session.rollback() # 出错时回滚更改 finally: db.session.close() # 关闭会话 return 'Hello, World!' if __name__ == '__main__': app.run() ``` 在上述示例,我们在一个路由函数进行数据库操作。如果操作成功,我们调用 `db.session.commit()` 提交更改。如果发生错误,我们调用 `db.session.rollback()` 回滚未提交的更改。无论如何,我们都要调用 `db.session.close()` 来关闭会话,释放资源。 总结一下,`db.session.rollback()` 方法用于回滚当前数据库会话的所有未提交的更改,以保持数据库的一致性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值