数据的查询

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


发布评论
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!

url_for知识解答
你是第一个吃螃蟹的人
发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。