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 '' % 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 '' % 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/")
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/")
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/")
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.创建前台的显示页面

添加学生页面


<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Titletitle>
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>

添加学生列表页面


<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Titletitle>
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>

修改学生界面


<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Titletitle>
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 %}
                        

6. 所有的操作界面

Python3:Flask的SQLAlchemy简单的一个增删改查的demo(基于sqlite3的操作,实现一对一和多对一)_第1张图片
Python3:Flask的SQLAlchemy简单的一个增删改查的demo(基于sqlite3的操作,实现一对一和多对一)_第2张图片
Python3:Flask的SQLAlchemy简单的一个增删改查的demo(基于sqlite3的操作,实现一对一和多对一)_第3张图片

7.总结

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

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

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

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

你可能感兴趣的:(Python3,Sqlite3,#,Flask)