• 主页

  • 投资

  • IT

    🔥
  • 设计

  • 销售

  • 共46篇

    python3.X - Web - Flask1.1.1

关闭

返回栏目

关闭

返回python3.X - Web - Flask1.1.1栏目

37 - Flask - 扩展 - SQLAlchemy - 增删改查-obj是字典

作者:

贺及楼

成为作者

更新日期:2024-03-24 12:04:10

Flask - 扩展 - SQLAlchemy - 增删改查-obj是字典

作用:增删改查数据库

参考:https://www.imooc.com/article/details/id/22343
参考:https://www.cnblogs.com/shangerzhong/articles/10381793.html

添加库

  1. #真正的数据库,蓝图过来的
  2. from app import db

  1. article = Article(username=username, age=age)
  2. db.session.add(article)
  3. db.session.commit()

  1. order.state = "1" #修改数据
  2. db.session.commit()
  1. 查-改同步-边查边改synchronize_session="evaluate"
  2. ITtable.query.filter(ITtable.id >= id).update({"id": ITtable.id + 1}, synchronize_session="evaluate")
  3. db.session.commit()

例子:

表类名.查.已知信息.条件.限制.数量
User.query.filter_by(name="小明").order_by(User.id.desc()).limit(50).all()

表类名———类名

查———query

已知信息———filter()还是filter_by()

filter_by()——简单搜索
filter_by(name="小明")

filter()——复杂搜索

  1. # 其他表
  2. filter_by(User2.name="小明")
  3. # 有相似
  4. filter_by(User.name.like("%小%"))
  5. # 非 ! 不等于
  6. filter_by(User.sex !="男")
  7. # 与或
  8. #flask-sqlalchemy同字段多条件的过滤方法
  9. from operator import and_,or_
  10. filter(and_(User.name.like("小%"), User.fullname.like("first%"))).all())
  11. filter(or_(User.name.like("小%"), User.password != None)).all())
  12. # 注意:要用==,不能是=
  13. # 空值
  14. filter(User.name == None)
  15. filter(User.name != None)
  16. # 超多条件
  17. map = []
  18. map.append(Accident.route_id == 1)
  19. filter(*map)
  20. # 列表
  21. user_list_in_ = User.query.filter(User.phone.in_(["123","456"],)).all()

条件———order_by()

  1. 顺序
  2. order_by(User.id)
  3. order_by("id")
  4. 倒序
  5. order_by(-User.id)
  6. order_by("-id")

限制———limit(50)

50代表数量

数量———all()还是first()

原生修改

  1. a = db.session.execute("select * from user")
  2. db.session.commit()
  3. data = list(a) # 最好转成list这样才可以多次使用
  4. a.fetchone().xxx # 取值
  5. a.fetchall().xxx

数数量

.count()

事务

可能有两个或多个操作
前一个操作成功
后一个可能操作错误
导致数据发生混乱
事务就是全都没问题才提交到数据库

一般是另起一个方法管理这个逻辑

  1. def new_group(cls, form):
  2. group = CaseGroup.query.filter_by(name=form.name.data, delete_time=None).first()
  3. if group is not None:
  4. raise ParameterException(msg="分组已存在")
  5. # 新增分组的时候同时新增可查看当前用例组的人员。当出现问题时进行回滚,人员和分组都不插入
  6. try:
  7. group = CaseGroup()
  8. group.name = form.name.data
  9. group.info = form.info.data
  10. db.session.add(group)
  11. db.session.flush()
  12. if form.users.data:
  13. current_app.logger.info(group.id)
  14. for user in form.users.data:
  15. user_auth = UserAuth()
  16. user_auth.user_id = user
  17. user_auth.auth_id = group.id
  18. user_auth.type = UserAuthEnum.GROUP
  19. db.session.add(user_auth)
  20. db.session.commit()
  21. except Exception as e:
  22. db.session.rollback()
  23. raise UnknownException(msg="新增异常 数据已回滚")
  24. return True

try except 将2次新增操作包裹起来
db.session.rollback()当出现异常时,进行数据回滚。

db.session.add()在一次新增后使用进行数据暂存,此时并未真正提交到数据库中

db.session.commit()需要在所有操作执行后进行数据提交。

db.session.flush()刷新获取分组id。在这个例子中,新增关联表的数据需要已新增分组数据的id,此时未commit所以自增id为None,需要在新增分组后使用