

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 实现修改和删除数据
附:常用过滤器如下:
过滤器 | 说明 | 示例 |
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

专题推荐




