一、功能描述
- 可以添加书籍
如果作者存在,书籍存在,不能添加
如果作者存在,书籍不存在,可以添加
如果作者存在,可以添加 - 删除书籍
- 删除作者,同时删除作者所有的书籍
- 使用wtf表单完成
二、基础代码
1.配置数据库:
- 创建一个demo_library.py文件
from flask import Flask, render_template
from flask_sqlalchemy import SQLAlchemy
from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField
from wtforms.validators import DataRequired
app = Flask(__name__)
host = 'localhost'
port = 3306
username = 'root'
password = 'root'
db = 'library'
connect_str = 'mysql+pymysql://{}:{}@{}:{}/{}'.format(username,password,host,port,db)
# 设置数据库连接
app.config['SQLALCHEMY_DATABASE_URI'] = connect_str
# 设置每次请求结束后自动提交数据库的改动
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
# 动态追踪设置
app.config['SQLALCHEMY_TRACK_MODUFICATIONS'] = True
# 显示原始sql
app.config['SQLALCHEMY_ECHO'] = True
# 数据库要和 app关联
db = SQLAlchemy(app)
-
打开数据库,新建一个名字叫做library的数据库
2.创建模型类
# 编写模型类
class Author(db.Model):
# 定义表名
__tablename__ = 'authors'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64), unique=True)
# 指定关系属性和反向引用
books = db.relationship('Book', backref='author')
# 编写模型类
class Book(db.Model):
# 定义表名
__tablename__ = 'books'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64), unique=True)
# 指定外键
author_id = db.Column(db.Integer, db.ForeignKey('authors.id')) # 或者Author.id
3.显示页面
- 在templates中创建一个library.html文件
# 展示页面
@app.route('/')
def show_page():
return render_template('library.html')
4.添加数据
if __name__ == '__main__':
# 为了方便演示,先删除所有表,再创建
db.drop_all()
db.create_all()
au1 = Author(name='老王')
au2 = Author(name='老尹')
au3 = Author(name='老刘')
# 把数据提交给用户会话
db.session.add_all([au1, au2, au3])
# 提交会话
db.session.commit()
bk1 = Book(name='老王回忆录', author_id=au1.id)
bk2 = Book(name='我读书少,你别骗我', author_id=au1.id)
bk3 = Book(name='如何才能让自己更骚', author_id=au2.id)
bk4 = Book(name='怎样征服美丽少女', author_id=au3.id)
bk5 = Book(name='如何征服英俊少男', author_id=au3.id)
# 把数据提交给用户会话
db.session.add_all([bk1, bk2, bk3, bk4, bk5])
# 提交会话
db.session.commit()
app.run(debug=True)
-
运行程序
三、查询所有作者
- 创建模型类
class BookForm(FlaskForm):
authorName = StringField(label='作者', validators=[DataRequired("作者不能为空")])
bookName = StringField(label='书籍', validators=[DataRequired("书籍不能为空")])
submit = SubmitField('添加')
- 查询所有作者
# 展示页面
@app.route('/')
def show_page():
# 查询所有作者
authors = Author.query.all()
return render_template('library.html', authors=authors)
- 打开library.html文件
-
刷新页面
- 将代码进行替代
-
刷新网页
四、添加书籍
- 打开demo.library
from flask import Flask, render_template, flash, redirect, url_for
from flask_sqlalchemy import SQLAlchemy
from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField
from wtforms.validators import DataRequired
app = Flask(__name__)
host = 'localhost'
port = 3306
username = 'root'
password = 'root'
db = 'library11'
connect_str = 'mysql+pymysql://{}:{}@{}:{}/{}'.format(username,password,host,port,db)
# 设置数据库连接
app.config['SQLALCHEMY_DATABASE_URI'] = connect_str
# 设置每次请求结束后自动提交数据库的改动
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
# 动态追踪设置
app.config['SQLALCHEMY_TRACK_MODUFICATIONS'] = True
# 显示原始sql
app.config['SQLALCHEMY_ECHO'] = True
# 数据库要和 app关联
db = SQLAlchemy(app)
# 设置
app.config['SECRET_KEY'] = 'dadasdasdasd'
# 编写模型类
class Author(db.Model):
# 定义表名
__tablename__ = 'authors'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64), unique=True)
# 指定关系属性和反向引用
books = db.relationship('Book', backref='author')
# 编写模型类
class Book(db.Model):
# 定义表名
__tablename__ = 'books'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64), unique=True)
# 指定外键
author_id = db.Column(db.Integer, db.ForeignKey('authors.id')) # 或者Author.id
# 自定表单, 继承 FlaskForm
class BookForm(FlaskForm):
authorName = StringField(label='作者', validators=[DataRequired("作者不能为空")])
bookName = StringField(label='书籍', validators=[DataRequired("书籍不能为空")])
submit = SubmitField('添加')
# 展示页面
@app.route('/')
def show_page():
# 创建表单
bookForm = BookForm()
# 查询所以作者
authors = Author.query.all()
return render_template('library.html',bookForm=bookForm, authors=authors)
# 添加书籍
@app.route('/add_book', methods=['POST'])
def add_book():
# 1、 创建表单
bookForm = BookForm()
# 验证参数功能
if bookForm.validate_on_submit():
# 获取参数
author_name = bookForm.authorName.data
book_name = bookForm.bookName.data
# 通过作者名称,查询作者对象
author = Author.query.filter(Author.name == author_name).first()
# 如果作者存在,书籍存在,不能添加
# 如果作者存在,书籍不存在,可以添加
# 如果作者存在,可以添加
# 进行判断
if author:
# # 通过书籍名称,查询书籍对象
book = Book.query.filter(Book.name == book_name, Book.author_id == author.id).first()
if book:
flash("该作者有该书籍")
else:
# 将书籍添加到该作者里面去
# 创建book对象
book = Book(name=book_name, author_id=author.id)
db.session.add(book)
db.session.commit()
else:
# 没作者,创建一个作者
author = Author(name= author_name)
db.session.add(author)
db.session.commit()
# 同时添加书籍
book = Book(name=book_name, author_id=author.id)
db.session.add(book)
db.session.commit()
# 重定向到原来的页面
return redirect(url_for('show_page'))
if __name__ == '__main__':
# 为了方便演示,先删除所有表,再创建
db.drop_all()
db.create_all()
au1 = Author(name='老王')
au2 = Author(name='老尹')
au3 = Author(name='老刘')
# 把数据提交给用户会话
db.session.add_all([au1, au2, au3])
# 提交会话
db.session.commit()
bk1 = Book(name='老王回忆录', author_id=au1.id)
bk2 = Book(name='我读书少,你别骗我', author_id=au1.id)
bk3 = Book(name='如何才能让自己更骚', author_id=au2.id)
bk4 = Book(name='怎样征服美丽少女', author_id=au3.id)
bk5 = Book(name='如何征服英俊少男', author_id=au3.id)
# 把数据提交给用户会话
db.session.add_all([bk1, bk2, bk3, bk4, bk5])
# 提交会话
db.session.commit()
app.run(debug=True)
- 打开library.html文件
Title
欢迎来到我们的图书小地摊
-
运行程序
五、删除书籍
- 打开demo_library.py文件
from flask import Flask, render_template, flash, redirect, url_for
from flask_sqlalchemy import SQLAlchemy
from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField
from wtforms.validators import DataRequired
app = Flask(__name__)
host = 'localhost'
port = 3306
username = 'root'
password = 'root'
db = 'library11'
connect_str = 'mysql+pymysql://{}:{}@{}:{}/{}'.format(username,password,host,port,db)
# 设置数据库连接
app.config['SQLALCHEMY_DATABASE_URI'] = connect_str
# 设置每次请求结束后自动提交数据库的改动
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
# 动态追踪设置
app.config['SQLALCHEMY_TRACK_MODUFICATIONS'] = True
# 显示原始sql
app.config['SQLALCHEMY_ECHO'] = True
# 数据库要和 app关联
db = SQLAlchemy(app)
# 设置
app.config['SECRET_KEY'] = 'dadasdasdasd'
# 编写模型类
class Author(db.Model):
# 定义表名
__tablename__ = 'authors'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64), unique=True)
# 指定关系属性和反向引用
books = db.relationship('Book', backref='author')
# 编写模型类
class Book(db.Model):
# 定义表名
__tablename__ = 'books'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64), unique=True)
# 指定外键
author_id = db.Column(db.Integer, db.ForeignKey('authors.id')) # 或者Author.id
# 自定表单, 继承 FlaskForm
class BookForm(FlaskForm):
authorName = StringField(label='作者', validators=[DataRequired("作者不能为空")])
bookName = StringField(label='书籍', validators=[DataRequired("书籍不能为空")])
submit = SubmitField('添加')
# 展示页面
@app.route('/')
def show_page():
# 创建表单
bookForm = BookForm()
# 查询所以作者
authors = Author.query.all()
return render_template('library.html',bookForm=bookForm, authors=authors)
# 添加书籍
@app.route('/add_book', methods=['POST'])
def add_book():
# 1、 创建表单
bookForm = BookForm()
# 验证参数功能
if bookForm.validate_on_submit():
# 获取参数
author_name = bookForm.authorName.data
book_name = bookForm.bookName.data
# 通过作者名称,查询作者对象
author = Author.query.filter(Author.name == author_name).first()
# 如果作者存在,书籍存在,不能添加
# 如果作者存在,书籍不存在,可以添加
# 如果作者存在,可以添加
# 进行判断
if author:
# # 通过书籍名称,查询书籍对象
book = Book.query.filter(Book.name == book_name, Book.author_id == author.id).first()
if book:
flash("该作者有该书籍")
else:
# 将书籍添加到该作者里面去
# 创建book对象
book = Book(name=book_name, author_id=author.id)
db.session.add(book)
db.session.commit()
else:
# 没作者,创建一个作者
author = Author(name= author_name)
db.session.add(author)
db.session.commit()
# 同时添加书籍
book = Book(name=book_name, author_id=author.id)
db.session.add(book)
db.session.commit()
# 重定向到原来的页面
return redirect(url_for('show_page'))
# 删除书籍
@app.route('/delete_book/')
def delete_book(book_id):
# 获取书籍
book = Book.query.get(book_id)
# 删除书籍
db.session.delete(book)
db.session.commit()
# 重定向到原来的页面
return redirect(url_for('show_page'))
# 删除作者
@app.route('/delete_author/')
def delete_author(author_id):
"""
删除作者
:param author_id:
:return:
"""
# 通过编号获取作者对象
author = Author.query.get(author_id)
# 删除 作者书籍
# 查询作者所有的书
for book in author.books:
db.session.delete(book)
# 删除作者
db.session.delete(author)
db.session.commit()
# 重定向到原来的页面
return redirect(url_for('show_page'))
if __name__ == '__main__':
# 为了方便演示,先删除所有表,再创建
db.drop_all()
db.create_all()
au1 = Author(name='老王')
au2 = Author(name='老尹')
au3 = Author(name='老刘')
# 把数据提交给用户会话
db.session.add_all([au1, au2, au3])
# 提交会话
db.session.commit()
bk1 = Book(name='老王回忆录', author_id=au1.id)
bk2 = Book(name='我读书少,你别骗我', author_id=au1.id)
bk3 = Book(name='如何才能让自己更骚', author_id=au2.id)
bk4 = Book(name='怎样征服美丽少女', author_id=au3.id)
bk5 = Book(name='如何征服英俊少男', author_id=au3.id)
# 把数据提交给用户会话
db.session.add_all([bk1, bk2, bk3, bk4, bk5])
# 提交会话
db.session.commit()
app.run(debug=True)
- 打开library.html文件
Title
欢迎来到我们的图书小地摊
-
运行程序
老王的书被删除了
(此文章仅作为个人学习笔记使用,如有错误欢迎指正~)