美文网首页
day58-Flask模型深入

day58-Flask模型深入

作者: xdxh | 来源:发表于2018-12-19 17:34 被阅读0次

一、模型定义

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 %}

相关文章

网友评论

      本文标题:day58-Flask模型深入

      本文链接:https://www.haomeiwen.com/subject/tqzjkqtx.html