数据库的事务与回滚
- image.png
如果插入失败的话,后续的插入也会失败的,所以必须要rollback
只要用到
[db.session.commit](http://db.session.commit/)()
建议都使用try..except...
包裹起来
Python的
@Contextmanager
装饰器,复杂了with语句,复杂了上下文管理器
# -*- coding: utf-8 -*-
class MyResource:
def __enter__(self):
print('connect to resource')
return self
def __exit__(self, exc_type, exc_val, exc_tb):
print("close resource connectionn")
def query(self):
print('query data')
with MyResource() as r:
r.query()
from contextlib import contextmanager
@contextmanager
def make_myresource():
print('connect to resource')
yield MyResource() # 中断状态
print("close resource connectionn")
# yield生成器
with make_myresource() as r:
r.query()
* 灵活运用@contextmanager
from contextlib import contextmanager
@contextmanager
def book_mark():
print('<',end='')
yield
print('>',end='')
with book_mark():
print('且将生活饮而尽',end='')
* 可以将一个不是上下文管理器的方法包装成为一个上下文管理器
from contextlib import contextmanager
from flask_sqlalchemy import SQLAlchemy as _SQLAlchemy, BaseQuery
class SQLAlchemy(_SQLAlchemy):
@contextmanager
def auto_commit(self):
try:
yield
self.session.commit()
except Exception as e: # 避免提交失败,
db.session.rollback()
raise e
应用:
# try:
with db.auto_commit():
gift = Gift()
gift.isbn = isbn
gift.uid = current_user.id # 这个地方的current_user,取决于model中设置了get_user,cookie中的uid转化成了user模型
# current_user.beans += 0.5
current_user.beans += current_app.config['BASE_UPLOAD_ONE_BOOK']
db.session.add(gift)
# db.session.commit()
# except Exception as e: # 避免提交失败,
# db.session.rollback()
# raise e
高级编程在于用所学的知识写出更好的代码来
知识综合应用的能力
类变量的陷阱
类变量定义是发生在整个变量创建的过程中,也就是启动服务的时候
实例变量是发生在对象的实例化的过程中