暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

专题二、flask的mysql增删改查必知

大话性能 2020-04-12
995
每周壹总结,一起共同充电
122

 

mysql数据所有的操作都可以归结为增删改查,今天就讲讲,举一些例子说明如何使用。

 

一、Flask-SQLAlchemy 实现增加数据

 

sqlalchemy 添加数据时,一定要注意,不仅仅要连接到数据表,并且你的创建表的类也必须写进来。而且字段和约束条件要吻合,不然会报错的。

 

sqlalchemy插入数据的格式一般是这样:

 

变量=创建表的类(字段名1=要插入的数据1,字段名2=要插入的数据2...

 

注意:flask 默认开启事务,所以操作完成后要 commit 才能提交到数据库。

 

r1 = Role(name="用户1")

db.session.add(r1)

db.session.commit()    # flask默认使用事务,所以每一次操作都要提交事务

 

r2 = Role(name="用户2")

r3 = Role(name="用户3")

r4 = Role(name="用户4")

db.session.add_all([r2,r3,r4])#多行时可以用session.add_all([x,x,x])

db.session.commit()

 

二、Flask-SQLAlchemy 实现查询数据

 

查询是使用频率最高的动作,下面举一些简单的例子说明,辅助理解。

1.查询全部的用户

 

user = User.query.all()

 

注:User 是创建表的类,这里替代表来使用。

 

all( ) 就是查询所有的,也可以查询第一个的,用 first( )

 

返回的结果 user 其实是一个列表,里面的每一个元素都是一行数据。有点抽象,你可以想象成一个表插分成一行一行的,然后放在列表里。

 

2.查询 id 1 的用户的名字

 

user = User.query.filter(User.id == 1).first()

user.name

 

注:filter 是一个过滤器,里面写条件,相当与SQL语句的 where 。但是注意字段名前要写创建表的类。还需要注意的是有两个等于号 ==

 

3.查询名字结尾字符为g的所有数据

endwithg = User.query.filter(User.name.endswith("g")).all()

print(endwithg)

 

4.查询名字开头字符为g的所有数据

startwithg = User.query.filter(User.name.startswith("z")).all()

print(startwithg)

 

5.查询名字不等于wang的所有数据

notwang = User.query.filter(User.name != "wang").all()

print(notwang)

 

6.查询password`123456`或者`email``itheima.com`结尾的所有数据

user=User.query.filter(or_(User.password=="123456",User.email.endswith("itheima.com"))).all()

print(user)

 

7.查询id[1, 3, 5, 7, 9]的用户列表

# sql语句中范围查询 in

# flask中 模型类名.字段.in_(列表)

list1 = [1,3,5,7,9]

user = User.query.filter(User.id.in_(list1)).all()

print(user)

 

8.查询所有用户数据,并以邮箱排序

user = User.query.order_by(User.id).all()    #顺序

print(user)


user = User.query.order_by(User.id.desc()).all()  # 倒序,字段名后加desc()

print(user)


9.每页3个,查询第2页的数据

# ret = paginate(页码,每一页的数据量)

ret = User.query.paginate(2,3)

print(ret.page)

print(ret.items)


注意:如果用到not_or_and_ 要导入!!!

from sqlalchemy import not_,or_,and_

 

三、Flask-SQLAlchemy 实现修改和删除数据


sqlchemy 修改和删除数据都是基于查询上的。我们必须先查出数据,all()是查出一行一行数据的列表,first()是查出第一行数据。一定要有这种查出来是一行的思想,才能更好的学习ORM

1.修改数据
user = User.query.first()
user.name = 'dong'
db.session.commit()

2.删除数据
user = User.query.first()
db.session.delete(user)
db.session.commit()

 

 

附:常用过滤器如下:

过滤器

说明

示例

filter(条件)

返回符合条件的查询集,BaseQuery对象

Book.query.filter(Book.id==1)

filter_by()

返回符合该等值条件的查询集

Book.query.filter_by(id=1)

limit

使用指定的值限定原查询返回的结果


offset()

偏移原查询返回的结果,返回一个新查询集


order_by()

根据字段进行排序,默认是正序,返回新查询集,desc可以反序

Book.query.order_by(Book.id)Book.query.order_by(Book.id.desc)

group_by()

根据字段进行分组,返回新查询集合


 

附:常用查询执行器如下:

方法

说明

示例

all()

以列表形式返回查询的所有结果

Book.query.filter(Book.id==1).all()

first()

返回查询的第一个结果,如果未查到,返回None

Book.query.filter(Book.id==1).first()

first_or_404()

返回查询的第一个结果,如果未查到,返回404


get()

返回指定主键对应的行,如不存在,返回None

Book.query.get(1)

get_or_404()

返回指定主键对应的行,如不存在,返回404


count()

返回查询结果的数量

Book.query.count()

paginate()

返回一个Paginate对象,它包含指定范围内的结果,参数一:第几页,参数二:每页个数,参数3:如果没有该页数返回False

Book.query.paginate(2,3,False)

 

 

四、业务中处理数据

 

了解了数据库的基本操作之后,就可以在flask业务逻辑中编写数据库处理代码了。


下面定义一个 Profile 模型,用来记录一个用户的基本信息。


class Profile(db.Model):

    id = db.Column(db.Integer, primary_key=True) # 主键

    name = db.Column(db.String(20))

    birthday = db.Column(db.Date())

    createtime = db.Column(db.DateTime())

    about = db.Column(db.Text())

 

1、查询业务


定义一个视图函数,将根据查询参数来找到对应的 Profile 记录,并且将该送给显示模板

 

@app.route('/myprofile/<id>/')

def myprofile(id):

    profile = Profile.query.get(id)  # 利用参数id读取数据库记录

    #将结果送给模板做展示

    return render_template('profile.html', profile=profile)  

模板代码 profile.html:

<h1>{{ profile.name }}'s Info </h1>

<dt>Name:</dt>

<dd>{{ profile.name }}</dd>

<dt>Birthday:</dt>

<dd>{{ profile.birthday }}</dd>

<dt>About:</dt>

<dd>{{ profile.about }} </dd>

启动应用后,访问 localhost:5000/myprofile/1 就可以看到 ID 1 Profile 信息。

 

2、添加业务


结合Form知识,在视图函数中处理表单中提交的内容,并保存的数据库,下面是视图函数:

 

@app.route('/createprofile/', methods=('GET', 'POST'))

def createprofile():

    form = MyForm()

    if form.validate_on_submit():  # 如果表单提交了 用表单数据创建 Profile 对象

        profile = Profile()

        profile.name = form.name.data

        profile.birthday = form.birthday.data

        profile.about = form.about.data or ""

        db.session.add(profile)

        db.session.commit()

        return redirect(url_for('myprofile', id=profile.id))#跳转展示页面

    else:

        return render_template('createprofile.html', form=form)#显示创建页

当判断表单被提交后,用提交数据创建 Profile 对象,存储到数据库,并且跳转到展示页面。

 

模版代码createprofile.html

{% macro render_field(field) %}

  <dt>{{ field.label }}:

  <dd>{{ field(**kwargs)|safe }}

  {% if field.errors %}

    <ul>

    {% for error in field.errors %}

      <li>{{ error }}</li>

    {% endfor %}

    </ul>

  {% endif %}

  </dd>

{% endmacro %}

 

<form method="POST">

    {{ form.csrf_token }}

    {{ render_field(form.name) }}

    {{ render_field(form.birthday) }}

    {{ render_field(form.about) }}

    <input type="submit" value="Submit">

</form>

 

 

五、总结


今天讲的都是最基础最核心的内容,务必一定要掌握,那么离真正的实战就不远了。



分享也是自我的一次提升


阿里面试/岗位交流

免费领取例子脚本和代码

免费PMP考试资料

免费python学习资料

扫一扫,加小T


专题推荐



● jmeter实时可视化图表化(高级

● jmeter5.0源码在eclipse正确打开方式

● jmeter+Jenkins性能测试自动化搭建

● jmeter+Jenkins性能测试高级用法(番外篇)

● jmeter的websocket接口性能测试

● jmeter工作实战心法-高级需求(附福利)

● jmeter工作实战心法-必备技能(附赠小技巧)

● jmeter测试mongodb,必会,高级知识

● jmeter tcp脚本的核心知识点理解

● jmeter beanshell脚本如何编写2个例子

● jmeter 如何一步步扩展自己的函数

● jmeter 正则表达式应用

● 新人如何学习性能测试

● 性能测试利剑-微服务的分布式追踪

● python如何和java高效的交互

文章转载自大话性能,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论