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

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

最后编辑于
?著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,128评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,316评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事?!?“怎么了?”我有些...
    开封第一讲书人阅读 159,737评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,283评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,384评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,458评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,467评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,251评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,688评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,980评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,155评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,818评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,492评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,142评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,382评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,020评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,044评论 2 352