flask orm

django是有orm操作的  可想而知 那么flask也是有orm操作的,其实flask的orm操作的使用和djnago的是差不多的  django的orm操作进行条件筛选的时候后面跟着的是objects

查询集

原始查询集

类名.query得到的结果就为原始查询集

数据查询集

加上各种的过滤器的方法 最终返回的结果 为数据查询集 都使用数据查询集

                     User.query.filter(User.username.in_(constraints)).limit(3).all()[<[User] username:`user0`, password:`0`, <[User]                      username:`user3`, password:`3`, <[User] username:`user6`, password:`6`]>>>
                    User.query.filter(User.username.notin_(constraints)).limit(3).all()[<[User] username:`m`, password:`password`,                     [User] username:`user1`, password:`1`, <[User] username:`user2`, password:`2`]>>>

# 先传参进来string类型的起、止日期,然后直接丢进查询语句里面

mintime = mindate + ' ' + '0:0:0'

maxtime = maxdate + ' ' + '23:59:59'

record_list = RecordModel.query.filter(RecordModel.reporttime >= mintime).filter(

                    RecordModel.reporttime <= maxtime).order_by(RecordModel.reporttime.desc()).all()

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__:小于等于


例子:

build_info = build.query.filter(build.create_time.__ge__("2019-09-05 11:42:11"), build.name==1).all()

# 模糊查询,查询姓名中包含小花的学生信息

# 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

---------------------

作者:HZ514

来源:CSDN

原文:https://blog.csdn.net/weixin_42750983/article/details/82431257

版权声明:本文为博主原创文章,转载请附上博文链接!

你可能感兴趣的:(flask orm)