Python3:Flask的SQLAlchemy简单的一个增删改查的demo(基于sqlite3的操作,实现一对一和多对一)

1.前言

由于本人学习了Flask中的SQLAlchemy操作sqlite3数据库,所以决定实现一个简单的增删改查的操作的demo,用来巩固自己所学习的知识!

基本的模式:

  1. 学生有:编号,名称,邮箱,以及对应的班级编号
  2. 班级有:编号,名称

实现的功能:

  1. 页面显示学生的所有信息,以及对应的班级的名称
  2. 可以添加学生信息,通过下拉列表选择当前的学生所在的班级
  3. 可以对学生进行删除修改操作,修改回显数据

2.创建基本的配置文件

当前的initdb.py中的内容

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///db.sqlite3'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
# 开启sql语句的显示
app.config['SQLALCHEMY_ECHO'] = True
db = SQLAlchemy(app)


class User(db.Model):
    __tablename = 'user'
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True, nullable=False)
    email = db.Column(db.String(120), unique=True, nullable=False)
    class_id = db.Column(db.Integer, db.ForeignKey('classes.id'))

    def __init__(self):
        print("初始化当前的User类")

    def __repr__(self):
        return '<User %r>' % self.username


class Classes(db.Model):
    __tablename = 'classes'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(50), unique=True, nullable=False)
    users = db.relationship("User", backref="classes")

    def __repr__(self):
        return '<Classes %r>' % self.name

当前需要注意的事项:

  1. 在建立外键的时候需要使用class_id = db.Column(db.Integer, db.ForeignKey('classes.id'))
  2. 当前班级中具有多个学生,需要使用db.relationship("User", backref="classes")来给对应的类添加属性,通过这个classes属性就可以访问到对应的班级名称了(,使用这个外键可以实现一对多的操作)
  3. 当前的ForeignKey对应的就是班级表中对应的外键的id编号

3.执行后完成数据表的创建

在当前的app.py中添加以下内容:

if __name__ == '__main__':
    db.drop_all()
    db.create_all()
    app.run(debug=True)

这样就创建了数据库

4.创建后台访问的接口

本人直接写在当前的app.py里面了!

from initdb import db, app, User, Classes
from flask import render_template, redirect, request, session

# 开启session后必须添加的数据
app.secret_key = "10010"


@app.route("/", methods=["GET"])
def find_all_users():
    users = User.query.all()
    # print(users)
    return render_template("list.html", users=users)


@app.route("/toAddPage", methods=["GET"])
def to_add_user_page():
    clazzes = Classes.query.all()
    return render_template("add.html", clazzes=clazzes)


@app.route("/add", methods=["POST"])
def add_user():
    msg = "添加成功!"
    if "username" in request.form and "email" in request.form and "class_id" in request.form:
        new_user = User()
        new_user.username = request.form["username"]
        new_user.email = request.form["email"]
        new_user.class_id = request.form["class_id"]
        db.session.add(new_user)
        db.session.commit()
    else:
        msg = "添加失败!"
    session["msg"] = msg
    return redirect("/")


@app.route("/get/<int:get_id>")
def get_by_id(get_id):
    get_user = User.query.get(get_id)  # User.query.filter_by(id=get_id).first()
    return "编号:{0},用戶名:{1},邮箱:{2}".format(get_user.id, get_user.username, get_user.email)


@app.route("/delete/<int:del_id>")
def delete_by_id(del_id):
    msg = "删除成功!"
    del_user = User.query.filter_by(id=del_id).first()
    if del_user is not None:
        db.session.delete(del_user)
        db.session.commit()
    else:
        msg = "删除失败!"
    session["msg"] = msg
    return redirect("/")


@app.route("/toUpdatePage/<int:update_id>")
def to_update_user_page(update_id):
    update_user = User.query.filter_by(id=update_id).first()
    if update_user is not None:
        clazzes = Classes.query.all()
        return render_template("update.html", clazzes=clazzes, updateUser=update_user)
    else:
        msg = "沒有id如何修改信息"
        return redirect("/")


@app.route("/update", methods=["POST"])
def update_user():
    msg = "修改成功!"
    if "id" in request.form and "username" in request.form and "email" in request.form and "class_id" in request.form:
        update_id = request.form["id"]
        update_user = User.query.get(update_id)
        update_user.username = request.form["username"]
        update_user.email = request.form["email"]
        update_user.class_id = request.form["class_id"]
        db.session.commit()
    else:
        msg = "修改失败!"
    session["msg"] = msg
    return redirect("/")


if __name__ == '__main__':
    # db.drop_all()
    # db.create_all()
    app.run(debug=True)

5.创建前台的显示页面

添加学生页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="add" method="post">
    <table border="1">
        <tr>
            <th colspan="2"><h1>添加用户列表</h1></th>
        </tr>
        <tr>
            <td>用户名:</td>
            <td><input type="text" name="username"/></td>
        </tr>
        <tr>
            <td>邮箱:</td>
            <td><input type="email" name="email"/></td>
        </tr>
        <tr>
            <td>班級编号:</td>
            <td>
                <select name="class_id">
                    {% for clazz in clazzes %}
                        <option value="{{ clazz.id }}">{{ clazz.name }}</option>
                    {% endfor %}
                </select>
            </td>
        </tr>
        <tr>
            <td colspan="2" align="center">
                <input type="button" value="返回" onclick="history.back()"/>
                <input type="submit" value="添加"/>
            </td>
        </tr>

    </table>
</form>
</body>
</html>

添加学生列表页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<table border="1">
    <tr>
        <th colspan="5"><h1>学生列表界面</h1></th>
    </tr>
    <tr>
        <td colspan="5"><a href="toAddPage">前往添加学生界面</a></td>
    </tr>
    <tr>
        <th>编号</th>
        <th>用户名</th>
        <th>邮箱</th>
        <th>班級</th>
        <th>操作</th>
    </tr>
    {% for u in users %}
        <tr>
            <td>{{ u.id }}</td>
            <td>{{ u.username }}</td>
            <td>{{ u.email }}</td>
            <td>{{ u.classes.name }}</td>
            <td>
                <a href="toUpdatePage/{{ u.id }}">修改</a>
                <a href="delete/{{ u.id }}">删除</a>
            </td>
        </tr>
    {% endfor %}
    {% if "msg" in session %}
        <tr>
            <td style="color: red" colspan="5" align="center">{{ session["msg"] }}</td>
        </tr>
    {% endif %}

</table>
</body>
</html>

修改学生界面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="../update" method="post">
    <table border="1">
        <tr>
            <input type="hidden" name="id" value="{{ updateUser.id }}"/>
            <th colspan="2"><h1>添加用户列表</h1></th>
        </tr>
        <tr>
            <td>用户名:</td>
            <td><input type="text" name="username" value="{{ updateUser.username }}"/></td>
        </tr>
        <tr>
            <td>邮箱:</td>
            <td><input type="email" name="email" value="{{ updateUser.email }}"/></td>
        </tr>
        <tr>
            <td>班級编号:</td>
            <td>
                <select name="class_id">
                    {% for clazz in clazzes %}
                        <option value="{{ clazz.id }}" {% if clazz.id == updateUser.class_id %}
                                selected
                        {% endif %}>{{ clazz.name }}</option>
                    {% endfor %}
                </select>
            </td>
        </tr>
        <tr>
            <td colspan="2" align="center">
                <input type="button" value="返回" onclick="history.back()"/>
                <input type="submit" value="修改"/>
            </td>
        </tr>

    </table>
</form>
</body>
</html>

6. 所有的操作界面

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

7.总结

1.在使用当前Flask的关系映射的时候需要注意当前的类型:

  1. 当前的 db.ForeignKey()指定的就是对应表的字段的名称,就是表外键
  2. db.relationship("需要连接关系的类", backref="通过哪个属性访问这个对象"),这个就是用来配置多对一的,双向关联

2.在使用session的时候需要注意一定要设置当前的app.secret_key

以上纯属个人见解,如有问题请联系本人!

发布了215 篇原创文章 · 获赞 39 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_45492007/article/details/103455669