flask 数据库操作orm 封装数据库操作及其使用
文章目录
- 一、flask数据库操作
- 1. 增
- 2. 查
- ① all 方法,获取所有对象,返回列表
- ② get方法 get只能加id才能查询
- ③ filter 过滤 获得符合条件的数据
- ④ first 获取第一条数据
- ⑤ order_by 排序
- ⑥ limit分页
- ⑦ offset(2) 偏移2,从第三个开始,常和imit连用
- ⑧ count()返回记录的数量
- ⑨ 配合filter使用的一些方法
- ⑩ group_by():分组
- ⑪paginate():分页查询,返回一个分页对象。paginate(参数1,参数2,参数3)
- ⑫常用的逻辑符 以及一些数据库查询
- ⑬ 查询的一些用法
- 3. 改
- 4. 删
- 二、封装orm数据库操作
一、flask数据库操作
1. 增
① 单条增加 add
userinfo = UserInfo(name="老王",age=19)
db.session.add(userinfo)
db.session.commit()
② 多条增加 add_all
db.session.add_all([
UserInfo(name="老王",age=19),
UserInfo(name="老王",age=19),
UserInfo(name="老王",age=19),
UserInfo(name="老王",age=19)
])
db.session.commit()
2. 查
① all 方法,获取所有对象,返回列表
data = UserInfo.query.all()
print(data)
for one in data:
print(one.name)
② get方法 get只能加id才能查询
get方法没有数据返回None,不像django一样报错;只能id、查询,并且只能通过id的值查询,或者用ident=1
data = UserInfo.query.get(1)
print(data)
print(data.name)
get只能加id才能查询;不能通过id=1才能查询
可以用ident=1
可以用get查询没有的id如果没有返回None
③ filter 过滤 获得符合条件的数据
- 第一种写法
data = UserInfo.query.filter_by(name='老王').all()
print(data)
- 第二种写法
data = UserInfo.query.filter(UserInfo.name=='老王').all()
print(data)
④ first 获取第一条数据
data = UserInfo.query.filter(UserInfo.name=='老王').first()
print(data)
⑤ order_by 排序
升序
- 排序第一种升序
data = UserInfo.query.order_by(UserInfo.id).all() # 按照id升序
- 排序第二种升序
data = UserInfo.query.order_by("id").all()
降序
- 排序第一种降序
data = UserInfo.query.order_by(UserInfo.id.desc()).all() # 按照id降序
- 排序第二种降序
data = UserInfo.query.order_by(db.desc("id")).all() # 按照id降序
⑥ limit分页
limit(2) 取两条数据
data = UserInfo.query.limit(2).all()
print(data)
⑦ offset(2) 偏移2,从第三个开始,常和imit连用
data = UserInfo.query.offset(2).limit(2).all()
print(data)
⑧ count()返回记录的数量
>>> Note.query.count()
4
⑨ 配合filter使用的一些方法
- like:
Note.query.filter(Note.body.like(’%Sam%’)).first()
<Note u’remember Sam Xia’>
- in:
Note.query.filter(Note.body.in_([‘Rose’,‘Sam’])).first()
<Note u’Rose’>
- not in:
Note.query.filter(~Note.body.in_([‘foo’])).all()
[<Note u’Hello~’>, <Note u’remember Sam Xia’>, <Note u’Rose’>, <Note u’I AM HERE TO TRUW BUBLEGUM AND KIK ASS, AND NOW I AM ALL OUT OF BUBLEGUM~’>]
- and:
使用and_()
from sqlalchemy import and_
Note.query.filter(and_(Note.body == ‘Rose’, Note.id == 3)).all()
[<Note u’Rose’>]
- 或者再filter()中加入多个表达式,使用逗号分隔
Note.query.filter(Note.body == ‘Rose’, Note.id == 3).all()
[<Note u’Rose’>]
- 或叠加调用多个filter()/filter_by()方法
filter()中的等号是两个
Note.query.filter(Note.body == ‘Rose’).filter(Note.id == 3).all()
[<Note u’Rose’>]
注意filter_by()中的等号是一个
Note.query.filter_by(body=‘Rose’).filter_by(id=3).all()
[<Note u’Rose’>]
- or:
Note.query.filter(or_(Note.body == ‘Rose’, Note.id == 2)).all()
[<Note u’remember Sam Xia’>, <Note u’Rose’>]
和filter()方法相比,filter_by()方法更易于使用。在filter_by()方法中,可以使用关键字表达式来指定过滤规则。更方便的是,可以在这个过滤器中直接使用字段名称。下面的例使用filter_by()过滤器完成了同样的任务:
Note.query.filter_by(body = ‘Rose’).all()
[<Note u’Rose’>]
⑩ group_by():分组
⑪paginate():分页查询,返回一个分页对象。paginate(参数1,参数2,参数3)
参数1:当前是第几页,参数2:每页显示几条记录,参数3:是否要返回错误。
返回的分页对象有三个属性:items:获得查询的结果,pages:获得一共有多少页,page:获得当前页。
⑫常用的逻辑符 以及一些数据库查询
需要倒入包才能用的有:from sqlalchemy import *
not_ and_ or_ 还有上面说的排序desc。
常用的内置的有:in_ 表示某个字段在什么范围之中。
endswith():以什么结尾。
startswith():以什么开头。
contains():包含
⑬ 查询的一些用法
1. 查询所有用户数据
User.query.all()
2. 查询有多少个用户
User.query.count()
3. 查询第1个用户
User.query.first()
4. 查询id为4的用户[3种方式]
User.query.get(4)
User.query.filter_by(id=4).first()
User.query.filter(User.id==4).first()
filter:(类名.属性名==)
filter_by:(属性名=)
filter_by: 用于查询简单的列名,不支持比较运算符
filter比filter_by的功能更强大,支持比较运算符,支持or_、in_等语法。
5. 查询名字结尾字符为g的所有数据[开始/包含]
User.query.filter(User.name.endswith('g')).all()
User.query.filter(User.name.contains('g')).all()
6. 查询名字不等于wang的所有数据[2种方式]
from sqlalchemy import not_
注意了啊:逻辑查询的格式:逻辑符_(类属性其他的一些判断)
User.query.filter(not_(User.name=='wang')).all()
User.query.filter(User.name!='wang').all()
7. 查询名字和邮箱都以 li 开头的所有数据[2种方式]
from sqlalchemy import and_
User.query.filter(and_(User.name.startswith('li'), User.email.startswith('li'))).all()
User.query.filter(User.name.startswith('li'), User.email.startswith('li')).all()
8. 查询password是 `123456` 或者 `email` 以 `itheima.com` 结尾的所有数据
from sqlalchemy import or_
User.query.filter(or_(User.password=='123456', User.email.endswith('itheima.com'))).all()
9. 查询id为 [1, 3, 5, 7, 9] 的用户列表
User.query.filter(User.id.in_([1, 3, 5, 7, 9])).all()
10. 查询name为liu的角色数据
关系引用
User.query.filter_by(name='liu').first().role.name
11. 查询所有用户数据,并以邮箱排序
排序
User.query.order_by('email').all() 默认升序
User.query.order_by(desc('email')).all() 降序
12. 查询第2页的数据, 每页只显示3条数据
help(User.query.paginate)
三个参数: 1. 当前要查询的页数 2. 每页的数量 3. 是否要返回错误
pages = User.query.paginate(2, 3, False)
pages.items # 获取查询的结果
pages.pages # 总页数
pages.page # 当前页数
3. 改
修改
data = UserInfo.query.filter(UserInfo.id==1).first()
data.name = "李四"
db.session.merge(data)
db.session.commit()
4. 删
- 第一种
data = UserInfo.query.filter().first()
print(data.id)
db.session.delete(data)
db.session.commit()
- 第二种
data = UserInfo.query.filter(UserInfo.id==2).delete()
db.session.commit()
二、封装orm数据库操作
封装类,定义相关函数方法
使用
# userinfo = UserInfo(name="awu",age=19)
# # 增加数据
# userinfo.save()
### 更新数据
# userinfo = UserInfo.query.get(8)
# userinfo.name="aliu"
# userinfo.merge()
## 删除数据
# userinfo = UserInfo.query.get(8)
# userinfo.delete()