图书馆数据库系统
时间:2022-06-26
本文章向大家介绍图书馆数据库系统,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
library.py
"""
分析图书馆案例
- 1.数据库配置
- 作者模型(一方)
- 书籍模型(多方)
- 2.添加测试数据
- 3.添加作者,书籍
- 4.删除作者,删除书籍
"""
from flask import Flask, render_template, request, redirect,flash
from flask_sqlalchemy import SQLAlchemy
from flask_wtf.csrf import CSRFProtect
app = Flask(__name__)
app.config["SECRET_KEY"] = "fdfdfd"
#使用CSRFProtect保护app
CSRFProtect(app)
#1.设置数据库配置信息
app.config["SQLALCHEMY_DATABASE_URI"] = "mysql+pymysql://root:123456@127.0.0.1:3306/library36"
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
# app.config["SQLALCHEMY_ECHO"] = True #写上之后会在控制台输出对应生成的sql语句
#2.创建SQLAlchemy对象,关联app
db = SQLAlchemy(app)
#3.编写模型类
#作者模型(一方)
class Author(db.Model):
__tablename__ = "authors"
id = db.Column(db.Integer,primary_key=True)
name = db.Column(db.String(32))
#关系属性
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(32))
#外键
author_id = db.Column(db.Integer,db.ForeignKey(Author.id))
# author_id = db.Column(db.Integer,db.ForeignKey("authors.id")) #和上面的方式等价
#4.展示页面
@app.route('/')
def show_index():
#1.查询所有的作者信息
authors = Author.query.all()
#2.携带作者信息,渲染页面
return render_template("file01library.html",authors=authors)
#5.添加数据
@app.route('/add_data', methods=["POST"])
def add_data():
#1.获取提交的数据
author_name = request.form.get("author")
book_name = request.form.get("book")
#1.1判断输入的内容是否为空
if not all([author_name,book_name]):
flash("作者或者书籍不能为空")
return redirect("/")
#2.根据作者的信息,查询作者对象
author = Author.query.filter(Author.name == author_name).first()
#3.判断作者是否存在
if author:
#4.通过书籍名称查询书籍对象, 获取该作者,有没有写过该书
book = Book.query.filter(Book.name == book_name,Book.author_id == author.id).first()
#5.判断书籍对象是否存在
if book:
flash("该作者,有该书了")
else:
#创建书籍对象,添加到数据库
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()
#6.重定向到首页展示
return redirect("/")
#6.删除书籍
@app.route('/delete_book/<int:book_id>')
def delete_book(book_id):
#1.根据书籍编号取出书籍对象
book = Book.query.get(book_id)
#2.删除书籍
db.session.delete(book)
db.session.commit()
#3.重定向到页面显示
return redirect("/")
#7.删除作者
@app.route('/delete_author/<int:author_id>')
def delete_author(author_id):
#1.根据作者编号取出作者对象
author = Author.query.get(author_id)
#2.遍历作者书籍,删除
for book in author.books:
db.session.delete(book)
#3.删除作者,提交数据库
db.session.delete(author)
db.session.commit()
#4.重定向展示页面
return redirect("/")
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
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{# action: 提交到的地址, method: 表示提交的方式 #}
<form action="/add_data" method="post">
{# 设置隐藏字段csrf_token , 只要使用了CSRFProtect,然后使用模板渲染的时候就可以直接使用csrf_token()方法#}
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
作者: <input type="text" name="author"><br>
书籍: <input type="text" name="book"><br>
<input type="submit" value="添加"><br>
{% for message in get_flashed_messages() %}
<span style="color: red;">{{ message }}</span>
{% endfor %}
</form>
<hr>
{# 数据展示 #}
<ul>
{# 遍历作者 #}
{% for author in authors %}
{# <li>作者: {{ author.name }} <a href="/delete_author/{{ author.id }}">删除</a></li>#}
<li>作者: {{ author.name }} <a href="{{ url_for("delete_author",author_id=author.id) }}">删除</a></li>
{# 遍历作者的书籍 #}
<ul>
{% for book in author.books %}
<li>书籍: {{ book.name }} <a href="/delete_book/{{ book.id }}">删除</a></li>
{% endfor %}
</ul>
{% endfor %}
</ul>
</body>
</html>
ORM相关操作流程
orm.py
"""
操作流程:
- 1.安装扩展
- pip install flask_sqlalchemy
- pip install flask_mysqldb / pymysql
- 2.设置数据库的配置信息
- 3.创建sqlalchemy对象db,关联app
- 4.编写模型类,字段,继承自db.Model,
- 5.操作数据库
- 增删改
- 查询
"""
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
#2.设置数据库的配置信息
#设置数据库的链接信息,
app.config["SQLALCHEMY_DATABASE_URI"] = "mysql+pymysql://root:123456@127.0.0.1:3306/data36"
#该字段增加了大量的开销,会被禁用,建议设置为False
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
#3.创建sqlalchemy对象db,关联app
db = SQLAlchemy(app)
# 4.编写模型类,字段,继承自db.Model
class Student(db.Model):
__tablename__ = "students"
#主键, 参数1: 表示id的类型, 参数2: 表示id的约束类型
id = db.Column(db.Integer,primary_key=True)
name = db.Column(db.String(32))
@app.route('/')
def hello_world():
return "helloworld"
if __name__ == '__main__':
#删除继承自db.Model的表
db.drop_all()
#5.创建数据库的表,创建的是继承自db.Model的表
db.create_all()
app.run(debug=True)
数据库的增删改
role_user.py
"""
增删改
- 全部都是使用db.session操作
- 常见方法:
- db.session.add(obj) 添加单个对象
- db.session.add_all([obj1,obj2]) 添加多个对象
- db.session.delete(obj) 删除单个对象
- db.session.commit() 提交会话
- db.drop_all() 删除继承自db.Model所有表
- db.create_all() :创建继承自db.Model的所有表
- 其他:
- db.session.rollback() 回滚
- db.session.remove() 移除会话
- 案例: 编写两个模型类, 一个角色模型类, 还有一个用户模型类
- 关系: 一对多
"""
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
#1.设置数据库的配置信息
app.config["SQLALCHEMY_DATABASE_URI"] = "mysql+pymysql://root:123456@127.0.0.1:3306/data36"
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
#2.创建SQLalchemy对象,关联app
db = SQLAlchemy(app)
#3.编写模型类
#角色(一方)
class Role(db.Model):
__tablename__ = "roles"
id = db.Column(db.Integer,primary_key=True)
name = db.Column(db.String(32))
#如果一个类继承自object那么重写__str__方法即可, 如果是继承自db.Model那么需要重写__repr__方法
def __repr__(self):
return "<Role:%s>"%self.name
#用户(多方)
class User(db.Model):
__tablename__ = "users"
id = db.Column(db.Integer,primary_key=True)
name = db.Column(db.String(32))
#建立外键
role_id = db.Column(db.Integer,db.ForeignKey(Role.id))
#如果一个类继承自object那么重写__str__方法即可, 如果是继承自db.Model那么需要重写__repr__方法
def __repr__(self):
return "<User:%s>"%self.name
@app.route('/')
def hello_world():
return "helloworld"
if __name__ == '__main__':
#为了演示方便,先删除表,后创建
db.drop_all()
db.create_all()
app.run(debug=True)
数据库的查询
role_user_query.py
"""
查询
"""
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
#1.设置数据库的配置信息
app.config["SQLALCHEMY_DATABASE_URI"] = "mysql+pymysql://root:123456@127.0.0.1:3306/data37"
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
app.config["SQLALCHEMY_ECHO"] = True
#2.创建SQLalchemy对象,关联app
db = SQLAlchemy(app)
#3.编写模型类
#角色(一方)
class Role(db.Model):
__tablename__ = "roles"
id = db.Column(db.Integer,primary_key=True)
name = db.Column(db.String(32))
#给role添加了一个users属性, 那么查询的方式是, role.users
#给user添加了一个role属性, 那么查询的方式是, user.role
users = db.relationship("User",backref="role",lazy="dynamic")
#如果一个类继承自object那么重写__str__方法即可, 如果是继承自db.Model那么需要重写__repr__方法
def __repr__(self):
return "<Role:%s>"%self.name
#用户(多方)
class User(db.Model):
__tablename__ = "users"
id = db.Column(db.Integer,primary_key=True)
name = db.Column(db.String(32))
email = db.Column(db.String(32))
password = db.Column(db.String(32))
#建立外键
role_id = db.Column(db.Integer,db.ForeignKey(Role.id))
#如果一个类继承自object那么重写__str__方法即可, 如果是继承自db.Model那么需要重写__repr__方法
def __repr__(self):
return "<User:%s,%s,%s,%s>"%(self.id,self.name,self.email,self.password)
@app.route('/')
def hello_world():
return "helloworld"
if __name__ == '__main__':
#为了演示方便,先删除表,后创建
db.drop_all()
db.create_all()
# 创建测试数据
ro1 = Role(name='admin')
db.session.add(ro1)
db.session.commit()
# 再次插入一条数据
ro2 = Role(name='user')
db.session.add(ro2)
db.session.commit()
# 多条用户数据
us1 = User(name='wang', email='wang@163.com', password='123456', role_id=ro1.id)
us2 = User(name='zhang', email='zhang@189.com', password='201512', role_id=ro2.id)
us3 = User(name='chen', email='chen@126.com', password='987654', role_id=ro2.id)
us4 = User(name='zhou', email='zhou@163.com', password='456789', role_id=ro1.id)
us5 = User(name='tang', email='tang@itheima.com', password='158104', role_id=ro2.id)
us6 = User(name='wu', email='wu@gmail.com', password='5623514', role_id=ro2.id)
us7 = User(name='qian', email='qian@gmail.com', password='1543567', role_id=ro1.id)
us8 = User(name='liu', email='liu@itheima.com', password='867322', role_id=ro1.id)
us9 = User(name='li', email='li@163.com', password='4526342', role_id=ro2.id)
us10 = User(name='sun', email='sun@163.com', password='235523', role_id=ro2.id)
db.session.add_all([us1, us2, us3, us4, us5, us6, us7, us8, us9, us10])
db.session.commit()
app.run(debug=True)
多对多关系
many_to_many.py
"""
多对多关系
案例: 学生和课程
"""
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
#1.设置数据库的配置信息
app.config["SQLALCHEMY_DATABASE_URI"] = "mysql+pymysql://root:123456@localhost:3306/data38"
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
#2.创建Sqlalchemy对象,关联app
db = SQLAlchemy(app)
#3.编写模型类
#中间表
tb_student_course = db.Table(
"tb_student_course",
db.Column("student_id",db.Integer,db.ForeignKey("students.id")),
db.Column("course_id",db.Integer,db.ForeignKey("courses.id"))
)
#学生
class Student(db.Model):
__tablename__ = "students"
id = db.Column(db.Integer,primary_key=True,autoincrement=True)
name = db.Column(db.String(32))
#关系属性secondary: 使用在多对多种,用来表示二次查询的
courses = db.relationship("Course",backref="students",secondary="tb_student_course")
#为了方便输出对象查看,重写__repr__方法
def __repr__(self):
return "<Student:%s>"%self.name
#课程
class Course(db.Model):
__tablename__ = "courses"
id = db.Column(db.Integer,primary_key=True,autoincrement=True)
name = db.Column(db.String(32))
#为了方便输出对象查看,重写__repr__方法
def __repr__(self):
return "<Student:%s>"%self.name
@app.route('/')
def hello_world():
return "helloworld"
if __name__ == '__main__':
#为了演示方便,先删除,后创建
db.drop_all()
db.create_all()
# 添加测试数据
stu1 = Student(name='张三')
stu2 = Student(name='李四')
stu3 = Student(name='王五')
cou1 = Course(name='物理')
cou2 = Course(name='化学')
cou3 = Course(name='生物')
stu1.courses = [cou2, cou3]
stu2.courses = [cou2]
stu3.courses = [cou1, cou2, cou3]
db.session.add_all([stu1, stu2, stu2])
db.session.add_all([cou1, cou2, cou3])
db.session.commit()
app.run(debug=True)
数据库迁移
flask_migrate.py
"""
数据库迁移[掌握]
- 目的: 当数据库的表结构发生变化之后,如果直接删除原有的数据,再添加新的数据,有可能导致数据丢失
- 注意点:
- 1.是为了备份表结构,而不是数据
- 2.如果想要备份数据,需要使用工具,navicat,mysqlworkbench,等等
- 操作流程:
- 1.安装扩展
- pip install flask_script
- pip install flask_migrate
- 2.导入三个类
- from flask_script import Manager
- from flask_migrate import Migrate, MigrateCommand
- 3.通过Manager类创建对象manager,管理app
- manager = Manager(app)
- 4.使用Migrate,关联db,app
- Migrate(app,db)
- 5.给manager添加一条操作命令
- manager.add_command("db",MigrateCommand)
- 相关迁移命令:
- 生成迁移文件夹
- python xxx.py db init
- 将模型类生成迁移脚本
- python xxx.py db migrate -m '注释'
- 将迁移脚本更新到数据库中
- python xxx.py db upgrade
"""
from flask import Flask
from flask_script import Manager
from flask_migrate import Migrate,MigrateCommand
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
#设置数据库配置信息
app.config["SQLALCHEMY_DATABASE_URI"] = "mysql+pymysql://root:123456@localhost:3306/data39"
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
#创建SQLAlchemy对象,关联app
db = SQLAlchemy(app)
#3.通过Manager类创建对象manager,管理app
manager = Manager(app)
# 4.使用Migrate,关联db,app
Migrate(app,db)
# 5.给manager添加一条操作命令
manager.add_command("db",MigrateCommand)
# 6.编写模型类
class Student(db.Model):
id = db.Column(db.Integer,primary_key=True)
name = db.Column(db.String(32))
age = db.Column(db.Integer)
@app.route('/')
def hello_world():
return "helloworld"
if __name__ == '__main__':
manager.run()
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- MYSQL错误码2059解决办法
- @陈同学的专属Python教程之函数
- 微信小程序的Web API接口设计及常见接口实现
- @陈同学的专属Python教程之常见数据结构
- 用易语言写个简单的小爬虫其中的关键点
- python坐标获取经纬度或经纬度获取坐标免费模块--geopy
- 详解:小程序页面预加载优化,让你的小程序运行如飞
- RocketMQ学习六-消息存储
- swoole 实现 unixSocket 通信
- mybatis-plus一对多关联查询踩坑
- 深入Spring Security魔幻山谷-获取认证机制核心原理讲解
- 文本相似性的总结
- Java面试题总结之JDBC 和Hibernate
- Mac 下搭建 Clion + OpenCV4.x 的开发环境
- 超详细,Windows系统搭建Flink官方练习环境