flask 数据库操作orm 封装数据库操作及其使用(flask通过SQLAlchemy操作数据库)

一、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连用


偏移offset() 和分页limit() 的使用方法只有下面这一种:

data = UserInfo.query.offset(2).limit(2).all()
print(data)

而下面这种的写法是错误的

data = UserInfo.query.all().offset(2).limit(2)

在这里插入图片描述


⑧ 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()

发布了107 篇原创文章 · 获赞 43 · 访问量 6163

猜你喜欢

转载自blog.csdn.net/langdei/article/details/102574067