我们都知道前后端交互需要用到数据库,那么选用什么样的数据库比较合适呢,下面就介绍一种ORM规范的数据库操作框架-SqlAlchemy
- 第一篇------环境搭建篇
- 第二篇------前后端交互Demo-路由+蓝图+上下文对象
- 第三篇------进阶篇-重定向+请求转发+Post表单提交+模板继承
- 第四篇------本篇
- 第五篇------flask实战-用户登录注册系统
1.什么是ORM?
ORM全称 Object-Relational Mapping,见名知意,意思就是把关系数据库的表结构映射到对象上,这就是ORM框架,那么这种映射关系由谁来处理呢,那么python中使用最多的就是SqlAlchemy框架,通过SqlAlchemy就可以使我们建立这种映射关系
2.SqlAlchemy-ORM框架-建立映射关系
- 下载SqlAlchemy:
pip install sqlalchemy
- 创建映射关系,当前目录结构如下
- 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
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()
- 执行完毕后结果如下图所示
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进行分页查询
- 控制台输出结果如下
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()
- 结果如下
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)
- 结果如下,可以看到刚才修改的记录已经被删除了
到此SqlAlchemy的增删改查操作就结束了,更多教程点击下列链接查看flask学习目录
转载自:https://blog.csdn.net/weixin_44232093/article/details/103539696