python_flask|flask通过SqlAlchemy操作数据库-增删改查实例(4-进阶篇)

我们都知道前后端交互需要用到数据库,那么选用什么样的数据库比较合适呢,下面就介绍一种ORM规范的数据库操作框架-SqlAlchemy
  • 第一篇------环境搭建篇
  • 第二篇------前后端交互Demo-路由+蓝图+上下文对象
  • 第三篇------进阶篇-重定向+请求转发+Post表单提交+模板继承
  • 第四篇------使用SqlAlchemy操作数据库
  • 后续更新目录在这里更新------flask从基础到入门再到实战学习目录
1.什么是ORM?
ORM全称 Object-Relational Mapping,见名知意,意思就是把关系数据库的表结构映射到对象上,这就是ORM框架,那么这种映射关系由谁来处理呢,那么python中使用最多的就是SqlAlchemy框架,通过SqlAlchemy就可以使我们建立这种映射关系
2.SqlAlchemy-ORM框架-建立映射关系
  • 下载SqlAlchemy: pip install sqlalchemy
  • 创建映射关系,当前目录结构如下
python_flask|flask通过SqlAlchemy操作数据库-增删改查实例(4-进阶篇)
文章图片

  • SqlAlchemyConf.py 文件内容如下
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time: 2019/12/14 15:41 # @Author: 宁宁小可爱 # @File: SqlAlchemyConf.py # @Software: PyCharm from sqlalchemy import Column, String, INTEGER,create_engine from sqlalchemy.orm import sessionmaker from sqlalchemy.ext.declarative import declarative_base """ 说明: @ 这里的create_engine进行的操作是创建数据库连接,填写参数格式如下: @ '数据库类型+数据库驱动名称://用户名:口令@机器地址:端口号/数据库名' @ 这里使用了.format函数,这就是个占位符,在format中按顺序填写就好,也可以指定编号比如{1} """ DATABASENAME = 'flask' IPADDRESS = 'localhost' engine = create_engine("mysql+mysqlconnector://root:root@{}:3306/{}".format(IPADDRESS, DATABASENAME))""" 说明: @ 这里的sessionmaker是一个工厂类,按照我们创建的engine绑定了数据库引擎 @ 当我们使用这个Session的时候都会创建一个绑定引擎的Session,通过Session操作数据库 """ DBSession = sessionmaker(bind=engine)# 创建一个父类数据库 Base = declarative_base()""" 说明: @ 以下代码会创建flask数据库中user表的映射关系 通过继承父类,指定字段类型表名将会建立映射关系"""class User(Base): __tablename__ = 'user'# 指定表名字为 user # 主键id, 自增, Integer类型 id = Column(INTEGER, primary_key=True, autoincrement=True) # userName字段 varchar类型 限制45 不为空 userName = Column(String(45), nullable=False) # passWord字段, varchar类型 限制45 不为空 passWord = Column(String(45), nullable=False)

  • 数据库表如下所示,必须与上面的 user相对应,不然构建不了映射关系,下图展示的是数据库的表属性,使用可视化软件为WorkBenck
python_flask|flask通过SqlAlchemy操作数据库-增删改查实例(4-进阶篇)
文章图片

3.使用SqlAlchemy添加+批量添加数据
  • SqlAlchemyDemo文件内容如下
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time: 2019/12/14 16:57 # @Author: 宁宁小可爱 # @File: SqlAlchemyDemo.py # @Software: PyCharm from SqlAlchemyConf import DBSession, User# 实例化session对象 session = DBSession() """ 说明: @ 这里从SqlAlchemy'文件中引入 DBSession ,目的是方便调用 @ 引入User对象,映射 flask数据库中的 user表 说明: @ 单个对象添加到数据库中 @ 这里User为配置文件中的User对象,id主键自增所以不用添加 @ add为添加单个对象调用语法 增删改后一定要调用commit提交,不然数据不会提交到数据库 """ def add(): user = User(userName='jack', passWord='123456') session.add(user) session.commit() session.close() """ 说明: @ 批量添加数据使用 session.add_all()方法,把对象统一存储到数组中 @ 把数组当做参数给方法即可 """ def add_all(): userList = [] for i in range(10): user = User(userName='jack{}'.format(i), passWord='123456') userList.append(user)session.add_all(userList) session.commit() session.close() if __name__ == '__main__': add_all()

  • 执行完毕后结果如下图所示
python_flask|flask通过SqlAlchemy操作数据库-增删改查实例(4-进阶篇)
文章图片

4.SqlAlchemy查找数据
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time: 2019/12/14 16:57 # @Author: 宁宁小可爱 # @File: SqlAlchemyDemo.py # @Software: PyCharm from SqlAlchemyConf import DBSession, User# 实例化session对象 session = DBSession() """ 说明: @ query(User).all() 函数中, query()的参数是你要查找的表的映射对象,也就是SqlAlchemyConf文件下的 class User对象 @ all的意思就是全部,所以第一个函数是查询所有@ query(User).count()查询记录条数总数 @ query(User).filter_by(userName='jack6').first() : 查询用户名为 jack6的第一个用户 返回单个对象 如果写all返回的是list@ query(User).slice(0, 3): 查询三条数据,slice应用在分页查询中 @ 分页的使用参考我这篇文章 :https://blog.csdn.net/weixin_44232093/article/details/100017742 """ def query_user(): user__all = session.query(User).all() for user in user__all: print("用户名: {}密码: {}".format(user.userName, user.passWord))count = session.query(User).count() print("总记录条数为: {}".format(count))first_name_eq_jack = session.query(User).filter_by(userName='jack6').first() print("查询用户名为 jack的用户的id为: {}".format(first_name_eq_jack.id))user__slice = session.query(User).slice(0, 3) for slice in user__slice: print("分页查询三条的结果为: id为; {}用户名为: {}".format(slice.id, slice.userName))if __name__ == '__main__': query_user()

  • 分页查询使用flask_paginate请参考我这篇文章: 详解使用flask_paginate进行分页查询
  • 控制台输出结果如下
python_flask|flask通过SqlAlchemy操作数据库-增删改查实例(4-进阶篇)
文章图片

5.SqlAlchemy修改
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time: 2019/12/14 16:57 # @Author: 宁宁小可爱 # @File: SqlAlchemyDemo.py # @Software: PyCharm from SqlAlchemyConf import DBSession, User# 实例化session对象 session = DBSession() """ 说明: @ 这里查询使用了第二种方式,使用对象点属性方式,用filter 那么filter和filter_by有什么区别呢 @ 语法区别: filter比较用一个等于号 ,filter_by用两个等号比较, filter比较时使用对象.属性方式, filter_by比较时直接使用属性名 @ 用法区别: filter进行多条件查询时需要使用and ,filter_by直接 ,分割即可@ 要修改必须要先查找出要修改的对象,用什么查询都行,然后直接重新赋值commit即可""" def update(): user = session.query(User).filter(User.id == 8).first() user.userName = 'update' user.passWord = '123321'session.add(user) session.commit() session.close()if __name__ == '__main__': update()

  • 结果如下
python_flask|flask通过SqlAlchemy操作数据库-增删改查实例(4-进阶篇)
文章图片

6.SqlAlchemy删除
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time: 2019/12/14 16:57 # @Author: 宁宁小可爱 # @File: SqlAlchemyDemo.py # @Software: PyCharm from SqlAlchemyConf import DBSession, User# 实例化session对象 session = DBSession() """ 说明: @ 要删除对象也是需要先把对象查找出来,执行commit提交即可""" def delete(id): user = session.query(User).filter(User.id == id).first()session.delete(user) session.commit() session.close()if __name__ == '__main__': delete(8)

  • 结果如下,可以看到刚才修改的记录已经被删除了
【python_flask|flask通过SqlAlchemy操作数据库-增删改查实例(4-进阶篇)】python_flask|flask通过SqlAlchemy操作数据库-增删改查实例(4-进阶篇)
文章图片

到此SqlAlchemy的增删改查操作就结束了,更多教程点击下列链接查看flask学习目录

    推荐阅读