数据的查询
all():查询全部的数据,其结果是一个列表,每一个元素都是一个对象 students = Student.query.all() 过滤查询: 第一种:filter,结果是baseQuery objects, 过滤条件的格式:对象.属性==值 studnets = Student.query.filter(Student.id==1) 第二种:filter_by,结果是baseQuery objects,可以进行遍历 students = Student.query.filter_by(id=1) 第三种:原生sql查询id=1的信息,结果是一个可以遍历的对象 sql = 'select * from student where id=1;' students = db.session.execute(sql) 模糊查询: 语法:filter(模型名.属性.运算符('xx')) 运算符: contains:包含 startswith:以什么开始 endswith:以什么结束 in_:在范围内 like:模糊 __gt__: 大于 __ge__:大于等于 __lt__:小于 __le__:小于等于 例子: # 模糊查询,查询姓名中包含小花的学生信息 # django中filter(s_name__contains='小花') students = Student.query.filter(Student.s_name.contains('小花')) # 以什么开始 students = Student.query.filter(Student.s_name.startswith('小')) # 以什么结束 students = Student.query.filter(Student.s_name.endswith('1')) # 查询年龄大于等于16的学生信息 students = Student.query.filter(Student.s_age.__gt__(15)) # 查询id在10到20之间的学生的学生信息 students = Student.query.filter(Student.s_age.in_([10,11,12])) # 查询年龄小于17的学生信息 Student.query.filter(Student.s_age < 17) students = Student.query.filter(Student.s_age.__lt__(17)) # 模糊查询,使用like,查询姓名中第二位为花的学生信息 # like '_花%',_代表必须有一个数据,%任何数据 students = Student.query.filter(Student.s_name.like('_花%')) 筛选: offset() # 跳过3个数据 stus = Student.query.offset(3) limit() # 跳过3个数据,查询5个信息 stus = Student.query.offset(3).limit(5) order_by() # 按照id降序,升序 students = Student.query.order_by('id') students = Student.query.order_by('-id') students = Student.query.order_by(desc('id')) students = Student.query.order_by(asc('id')) students = Student.query.order_by('id desc') students = Student.query.order_by('id asc') get() #使用get,获取id=1的学生对象,get()默认接收id # 拿不到值不会报错,返回空 students = Student.query.get(4) first() # 获取年龄最大的一个 stus = Student.query.order_by('-s_age').first() 逻辑运算 与 and_ filter(and_(条件),条件…) 或 or_ filter(or_(条件),条件…) 非 not_ filter(not_(条件),条件…) 例子: and_ students = Student.query.filter(Student.s_age==16, Student.s_name.contains('花')) students = Student.query.filter(and_(Student.s_age==16, Student.s_name.contains('花'))) not_ students = Student.query.filter(or_(Student.s_age==16, Student.s_name.contains('花'))) or_ students = Student.query.filter(not_(Student.s_age==16), Student.s_name.contains('花')) 注意: 1. fliter和filter_by的结果可遍历 2. 可以通过对其结果使用all()方法将其转换成一个列表或者first()转换成objects对象。 3. all()获得的是列表,列表没有first()方法 4. fliter和filter_by有flrst()方法,没有last方法
数据的添加
在flask中修改数据后需要添加事务和提交事务
事务: 完整,一致,持久,原子
第一种:保存数据
将数据放入缓存
db.session.add(stu)
将缓存中的数据提交
db.session.commit()
在学生表中添加数据
@blue.route('/createstu/') def create_stu(): s = Student() s.s_name = '小花' s.s_age = 19 db.session.add(s) db.session.commit() return '添加成功' 提交事务,使用commit提交我们的添加数据的操作
批量创建数据
批量添加数据时可以使用add()、add_list()添加事务
add():
db.session.add_all(stu)
db.session.commit()
stu是一个对象
add_list():
db.session.add_all(stus_list)
db.session.commit()
stus_list是一个列表,其每个元素都是一个对象
第一种
@app_blue.route('create_many_stu/',methods=['GET']) def create_many_stu(): if request.method == 'GET': stu = Student() stus_list = [] for i in range(5): stu = Student() stu.s_name = '小花%s' % random.randrange(10, 1000) stu.s_age = random.randint(10,20) stus_list.append(stu) db.session.add_all(stus_list) db.session.commit() # db.session.add(stu) # db.session.commit return '批量创建' db.session.add_all(stus_list) db.session.commit() 将列表中的数据统一添加到缓存区中,并提交
第二种
第二种:重写init models中: def __init__(self, name, age): # 2,给对象赋值 self.s_name = name self.s_age = age views中: @app_blue.route('create_many_stu_init/',methods=['GET']) def create_many_stu(): if request.method == 'GET': stus_list = [] for i in range(5): stu = Student('小花%s' % random.randrange(10,1000), random.randint(10,20)) stus_list.append(stu) db.session.add_all(stus_list) db.session.commit() # db.session.add(stu) # db.session.commit return '批量创建成功'
修改数据
思路:获取到需要修改的对象,通过对象.属性的方式将属性重新赋值,然后使用commit提交事务
写法1
students = Student.query.filter_by(s_id=3).first() students.s_name = '哈哈' db.session.commit()
写法2
Student.query.filter_by(s_id=3).update({'s_name':'娃哈哈'}) db.session.commit()
删除数据
格式:db.session.delete(对象)
db.session.commit()
注意:在修改数据(增删改)中如果使用commit()的话,只会修改本地缓存中的数据,数据库中的数据不会更新。
必须使用:db.session.commit()
写法1
students = Student.query.filter_by(s_id=2).first()
db.session.delete(students)
db.session.commit()
写法2
students = Student.query.filter_by(s_id=1).all() db.session.delete(students[0]) db.session.commit()
模型 和Django的区别: a. 模型中不定义数据库的表名: 在django中默认表名为:'应用appming_模型名小写' 在flask中默认的表名为:模型名的小写 b. 主键自增字段: django中会默认创建自增的主键id flask中需要手动创建自增的id: id = db.Column(db.Integer, primary_key=True, autoincrement=True) c.查询所有数据的结果all() 在django结果中查询的结果是QuerySet 在flask中查询结果是List d.查询满足条件的数据的结果,filter() 在django查询结果是QuerySet 在flask中查询结果是baseQuery objects