由于本人学习了Flask中的SQLAlchemy操作sqlite3数据库,所以决定实现一个简单的增删改查的操作的demo
,用来巩固自己所学习的知识!
基本的模式:
实现的功能:
当前的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
当前需要注意的事项:
class_id = db.Column(db.Integer, db.ForeignKey('classes.id'))
班级中具有多个学生
,需要使用db.relationship("User", backref="classes")来给对应的类添加属性
,通过这个classes属性就可以访问到对应的班级名称
了(,使用这个外键可以实现一对多的操作
)在当前的app.py中添加以下内容:
if __name__ == '__main__':
db.drop_all()
db.create_all()
app.run(debug=True)
这样就创建了数据库
本人直接写在当前的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)
添加学生页面
<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 %}
1.在使用当前Flask的关系映射的时候需要注意当前的类型:
db.ForeignKey()指定的就是对应表的字段的名称,就是表外键
db.relationship("需要连接关系的类", backref="通过哪个属性访问这个对象"),这个就是用来配置多对一的,双向关联
2.在使用session的时候需要注意一定要设置当前的app.secret_key
以上纯属个人见解,如有问题请联系本人!