Python学习
2021-05-02 本文已影响0人
逛逛_堆栈
flask-sqlalchemy数据库操作(二)
1、数据查询
如何从数据库取回数据呢,使用模型类提供的query属性附加调用各种过滤方法及查询方法可以完成这个任务。
一般来说,一个完整的查询遵循下面的模式:
<模型类>.query.<过滤方法>.<查询方法>
查询方法
过滤方法
1.1、查询所有数据
# 查询所有的数据
stus = Student.query.all()
for stu in stus:
print('编号:%d 姓名:%s 性别:%s 生日:%s 地址:%s' %(stu.id,stu.name,stu.sex,stu.birthday,stu.address))
1.2、过滤查询
第一种:filter,结果是baseQuery objects,
过滤条件的格式:对象.属性==值
stus = Student.query.filter(Student.id == 2)
for stu in stus:
print('编号:%d 姓名:%s 性别:%s 生日:%s 地址:%s' % (stu.id, stu.name, stu.sex, stu.birthday, stu.address))
第二种:filter_by,结果是baseQuery objects,可以进行遍历。
stus = Student.query.filter_by(id = 2)
for stu in stus:
print('编号:%d 姓名:%s 性别:%s 生日:%s 地址:%s' % (stu.id, stu.name, stu.sex, stu.birthday, stu.address))
第三种:原生sql查询id=1的信息,结果是一个可以遍历的对象。
sql = 'select * from db_student where id = 2'
students = db.session.execute(sql)
for stu in students:
print('编号:%d 姓名:%s 性别:%s 生日:%s 地址:%s' % (stu.id, stu.name, stu.sex, stu.birthday, stu.address))
1.3、模糊查询
语法:filter(模型名.属性.运算符('xx'))
常用运算符:
contains:包含
startswith:以什么开始
endswith:以什么结束
in_:在范围内
like:模糊
__gt__: 大于
__ge__:大于等于
__lt__:小于
__le__:小于等于
contains:包含
students = Student.query.filter(Student.name.contains('李'))
for stu in students:
print('编号:%d 姓名:%s 性别:%s 生日:%s 地址:%s' % (stu.id, stu.name, stu.sex, stu.birthday, stu.address))
in:在范围内
students = Student.query.filter(Student.id.in_([1, 2, 3]))
for stu in students:
print('编号:%d 姓名:%s 性别:%s 生日:%s 地址:%s' % (stu.id, stu.name, stu.sex, stu.birthday, stu.address))
like:模糊查询
students = Student.query.filter(Student.name.like('_三%'))
for stu in students:
print('编号:%d 姓名:%s 性别:%s 生日:%s 地址:%s' % (stu.id, stu.name, stu.sex, stu.birthday, stu.address))
lt、小于
students = Student.query.filter(Student.birthday.__lt__('1991-06-06'))
for stu in students:
print('编号:%d 姓名:%s 性别:%s 生日:%s 地址:%s' % (stu.id, stu.name, stu.sex, stu.birthday, stu.address))
1.4、查询筛选
limit、限制查询的结果数量
students = Student.query.limit(2)
for stu in students:
print('编号:%d 姓名:%s 性别:%s 生日:%s 地址:%s' % (stu.id, stu.name, stu.sex, stu.birthday, stu.address))
offset、跳过几个数据
students = Student.query.offset(2)
for stu in students:
print('编号:%d 姓名:%s 性别:%s 生日:%s 地址:%s' % (stu.id, stu.name, stu.sex, stu.birthday, stu.address))
order_by、排序
students = Student.query.order_by(desc('birthday')).limit(1)
# students = Student.query.order_by(asc('birthday')).limit(1)
for stu in students:
print('编号:%d 姓名:%s 性别:%s 生日:%s 地址:%s' % (stu.id, stu.name, stu.sex, stu.birthday, stu.address))
get、默认根据id获得数据
stu = Student.query.get(3)
# for stu in students:
print('编号:%d 姓名:%s 性别:%s 生日:%s 地址:%s' % (stu.id, stu.name, stu.sex, stu.birthday, stu.address))
first、获得第一个结果
stu = Student.query.order_by('birthday').first()
#for stu in students:
print('编号:%d 姓名:%s 性别:%s 生日:%s 地址:%s' % (stu.id, stu.name, stu.sex, stu.birthday, stu.address))
1.5、逻辑运算
逻辑与And
stus = Student.query.filter(and_(Student.sex == '女',Student.name.contains('四'))).all()
for stu in stus:
print('编号:%d 姓名:%s 性别:%s 生日:%s 地址:%s' % (stu.id, stu.name, stu.sex, stu.birthday, stu.address))
逻辑或
stus = Student.query.filter(or_(Student.id == 2,Student.id == 3)).all()
for stu in stus:
print('编号:%d 姓名:%s 性别:%s 生日:%s 地址:%s' % (stu.id, stu.name, stu.sex, stu.birthday, stu.address))
逻辑非
stus = Student.query.filter(not_(Student.id == 2)).all()
for stu in stus:
print('编号:%d 姓名:%s 性别:%s 生日:%s 地址:%s' % (stu.id, stu.name, stu.sex, stu.birthday, stu.address))