欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

flask 数据库操作orm 封装数据库操作及其使用

程序员文章站 2024-03-14 12:28:52
...

一、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)

flask 数据库操作orm 封装数据库操作及其使用


② get方法 get只能加id才能查询


get方法没有数据返回None,不像django一样报错;只能id、查询,并且只能通过id的值查询,或者用ident=1

data = UserInfo.query.get(1)
print(data)
print(data.name)

get只能加id才能查询;不能通过id=1才能查询
flask 数据库操作orm 封装数据库操作及其使用
可以用ident=1
flask 数据库操作orm 封装数据库操作及其使用
可以用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数据库操作


封装类,定义相关函数方法
flask 数据库操作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()