一、模型定义
1.安装flask_sqlalchemy和mysql驱动
pip install flask-sqlalchemy
pip install mysql
2.定义模型(models.py)
from flask_sqlalchemy import SQLAlchemy
# 获取SQLAlchemy对象
db = SQLAlchemy()
class Student(db.Model):
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
s_name = db.Column(db.String(80), unique=True, nullable=False)
# 定义表名
__tablename__ = 'stu'
二、数据库连接
1.配置数据库
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:123456@127.0.0.1:3306/flask'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
2.初始化db和app对象
from flask_sqlalchemy import SQLALchemy
方法一:
app = Flask(__name__)
db = SQLAlchemy(app)
方法二:
from app.models import db
app = Flask(__name__)
db.init_app(app)
三、数据库迁移
1.创建数据表
db.create_all()表示创建定义模型中对应到数据库中的表
注意:db.create_all()只可以调用一次。
@blue.route('/create_db/')
def create_db():
db.create_all()
return '创建数据库成功'
2.删除数据库中所有的表
db.drop_all()表示删除数据库中所有的表
@blue.route('/drop_db/')
def drop_db():
db.drop_all()
return '删除数据库成功'
四、查询数据
1.语法
模型.query.all()
模型.query.filter(模型.属性名 == xxx)
模型.query.filter_by(属性名=xxx)
模型.query.get(id)
2.数据操作
db.session.add(object)
db.session.commit()
3.查询所有学生的信息
注意:all()返回的结果是列表。
@blue.route('/list/', methods=['GET'])
def stu_list():
students = Student.query.all()
return render_template('list.html', students=students)
4.排序
(1)升序
对象 = 模型.query.order_by(属性名)
对象 = 模型.query.order_by(属性名 asc)
(2)降序
对象 = 模型.query.order_by(-属性名)
对象 = 模型.query.order_by(属性名 desc)
@blue.route('/sel_stu/', methods=['GET'])
def sel_stu():
# 升序
stus = Student.query.order_by('s_age')
stus = Student.query.order_by('s_age asc')
# 降序
stus = Student.query.order_by('-s_age')
stus = Student.query.order_by('s_age desc')
return '查询成功'
5.获取指定条数的数据
stus = 模型.query.offset(跳过的记录条数).limit(截取的记录条数)
@blue.route('/sel_stu/', methods=['GET'])
def sel_stu():
stus = Student.query.offset(0).limit(2)
return '查询成功'
6.模糊查询
contains():包含
startswith():以特定字符开头
endswith():以特定字符结尾
like():模糊查询
@blue.route('/sel_stu/', methods=['GET'])
def sel_stu():
stus = Student.query.filter(Student.s_name.contains('小明')).all()
stus = Student.query.filter(Student.s_name.startswith('小')).all()
stus = Student.query.filter(Student.s_name.endswith('明')).all()
stus = Student.query.filter(Student.s_name.like('_明%')).all()
return '查询成功'
7._in查询
@blue.route('/sel_stu/', methods=['GET'])
def sel_stu():
stus = Student.query.filter(Student.id.in_([1, 2, 3, 4, 5]))
return '查询成功'
8.条件查询
lt: <
le: <=
gt: >
ge: >=
@blue.route('/sel_stu/', methods=['GET'])
def sel_stu():
# 小于
stus = Student.query.filter(Student.s_age.__lt__(21)).all()
stus = Student.query.filter(Student.s_age < 21).all()
# 小于等于
stus = Student.query.filter(Student.s_age.__le__(21)).all()
stus = Student.query.filter(Student.s_age <= 21).all()
# 大于
stus = Student.query.filter(Student.s_age.__gt__(21)).all()
stus = Student.query.filter(Student.s_age > 21).all()
# 大于等于
stus = Student.query.filter(Student.s_age.__ge__(21)).all()
stus = Student.query.filter(Student.s_age >= 21).all()
return '查询成功'
9.条件查询
and_:与
or_:或
not_:非
@blue.route('/sel_stu/', methods=['GET'])
def sel_stu():
# and_
stus = Student.query.filter(and_(Student.s_age < 22, Student.s_name.endswith('明'))).all()
stus = Student.query.filter(Student.s_age < 22).filter(Student.s_name.endswith('明')).all()
stus = Student.query.filter(Student.s_age < 22, Student.s_name.endswith('明')).all()
# or_
stus = Student.query.filter(or_(Student.s_age < 22, Student.s_name.endswith('明'))).all()
# not_
stus = Student.query.filter(not_(Student.s_age == 22)).all()
return '查询成功'
五、添加数据
提交事务,使用commit提交添加数据的操作
1.语法
对象 = 模型()
对象.属性名 = xxx
2.数据操作
db.session.add(对象)
db.session.commit
3.添加学生信息
@blue.route('/add/', methods=['GET', 'POST'])
def stu_add():
if request.method == 'GET':
return render_template('add.html')
if request.method == 'POST':
username = request.form.get('username')
phone = request.form.get('phone')
age = request.form.get('age')
stu = Student()
stu.s_name = username
stu.s_phone = phone
stu.s_age = age
db.session.add(stu)
db.session.commit()
return redirect(url_for('app.stu_list'))
4.批量添加学生信息
@blue.route('/add_all/', methods=['GET'])
def add_all():
stus = []
for i in range(10):
stu = Student()
stu.s_name = '小明%s' % random.randint(0, 10000)
stu.s_phone = '12345678910'
stu.s_age = random.randint(18, 28)
stus.append(stu)
db.session.add_all(stus)
db.session.commit()
return '创建成功'
六、修改数据
1.语法
对象 = 模型.query.filter(模型.属性名 == xxx).first()
对象.属性名 = xxx
2.数据操作
db.session.commit()
3.修改学生信息
注意: db.session.add(stu)可以省略不写。
@blue.route('/edit/<int:id>', methods=['GET', 'POST'])
def stu_edit(id):
if request.method == 'GET':
stu = Student.query.filter(Student.id == id).first()
return render_template('add.html', stu=stu)
if request.method == 'POST':
username = request.form.get('username')
phone = request.form.get('phone')
age = request.form.get('age')
stu = Student.query.filter(Student.id == id).first()
stu.s_name = username
stu.s_phone = phone
stu.s_age = age
# db.session.add(stu)
db.session.commit()
return redirect(url_for('app.stu_list'))
七、删除数据
1.语法
对象 = 模型.query.filter(模型.属性名 == xxx).first()
2.数据操作
db.session.delete(对象)
db.session.commit()
3.删除指定id的学生
@blue.route('/del/<int:id>/', methods=['GET'])
def stu_del(id):
if request.method == 'GET':
# 1.获取删除的对象
stu = Student.query.filter(Student.id == id).first()
# 2.使用delete(对象)
db.session.delete(stu)
db.session.commit()
return redirect(url_for('app.stu_list'))
八、分页
1.分页属性
分页对象.items:获取数据
分页对象.has_prev:是否存在上一页
分页对象.prev_num:上一页脚码
分页对象.has_next:是否存在下一页
分页对象.next_num:下一页脚码
分页对象.pages:共多少页
分页对象.page:当前页
分页对象.total:共多少条数据
分页对象.iter_pages():脚码
2.paginate实现分页
@blue.route('/list/', methods=['GET'])
def stu_list():
page = int(request.args.get('page', 1))
pre_page = 5
paginate = Student.query.paginate(page, pre_page)
students = paginate.items
return render_template('list.html', students=students, paginate=paginate)
3.list.html
{% extends 'base.html' %}
{% block title %}
学生列表页面
{% endblock %}
{% block content %}
<p><a href="{{ url_for('app.stu_add') }}">添加学生信息</a></p>
<table>
<thead>
<th>id</th>
<th>姓名</th>
<th>年龄</th>
<th>电话</th>
<th>操作</th>
</thead>
<tbody>
{% for stu in students %}
<tr>
<td>{{ stu.id }}</td>
<td>{{ stu.s_name }}</td>
<td>{{ stu.s_age }}</td>
<td>{{ stu.s_phone }}</td>
<td>
<a href="{{ url_for('app.stu_edit', id=stu.id) }}">编辑</a>
|
<a href="{{ url_for('app.stu_del', id=stu.id) }}">删除</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
<p>
{% if paginate.has_prev %}
<a href="{{ url_for('app.stu_list') }}?page={{ paginate.prev_num }}">上一页</a>
{% endif %}
{% for i in paginate.iter_pages() %}
<a href="{{ url_for('app.stu_list') }}?page={{ i }}">{{ i }}</a>
{% endfor %}
{% if paginate.has_next %}
<a href="{{ url_for('app.stu_list') }}?page={{ paginate.next_num }}">下一页</a>
{% endif %}
当前{{ paginate.page }}页,共{{ paginate.pages }}页,一共{{ paginate.total }}条数据
</p>
{% endblock %}