#! /usr/bin/env python
# *-* coding: utf-8 *-* from flask import Flask, flash, redirect
from flask import url_for
from flask import request
from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField
from wtforms.validators import InputRequired
from flask import render_template
from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) # 配置数据库连接地址
app.config["SQLALCHEMY_DATABASE_URI"] = "mysql://root:qw123666@localhost/test?charset=utf8"
# 是否追踪数据库的修改
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.config["SQLALCHEMY_ECHO"] = False
app.secret_key = "" # 初始化 SQLAlchemy 对象
db = SQLAlchemy(app) # 定义模型类-作者
class Author(db.Model):
__tablename__ = 'author'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(32), unique=True)
book = db.relationship('Book', backref='author') # def __repr__(self):
# return 'Author:%s' % self.name # 定义模型类-书名
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)) # def __str__(self):
# return 'Book:%s,%s' % (self.info, self.lead) class AddBookForm(FlaskForm):
author = StringField("作者", validators=[InputRequired("请输入作者名")])
book = StringField("书名", validators=[InputRequired("请输入书名")])
submit = SubmitField("添加") @app.route("/index", methods=["get", "post"])
def index():
# 获取所有的作者
bookform = AddBookForm()
if request.method == "POST":
# 取值
if bookform.is_submitted():
author_name = bookform.author.data
book_name = bookform.book.data
# 查指定作者的名字是否存在
author = Author.query.filter(Author.name == author_name).first()
if not author:
try:
# 增加作者
author_obj = Author(name=author_name)
db.session.add(author_obj)
db.session.commit()
# 增加书名
book_obj = Book(name=book_name, author_id=author_obj.id)
db.session.add(book_obj)
db.session.commit()
except Exception as e:
db.session.rollback()
flash("添加失败")
else:
try:
book_obj = Book(name=book_name, author_id=author.id)
db.session.add(book_obj)
db.session.commit()
except Exception as e:
db.session.rollback()
flash("添加失败")
# 往数据开中写入值
authors = Author.query.all()
return render_template("index.html", authors=authors, form=bookform) authors = Author.query.all()
return render_template("index.html", authors=authors, form=bookform) @app.route("/delete_author/<author_id>")
def delete_author(author_id):
author_obj = Author.query.get(author_id)
if author_obj:
try:
Book.query.filter(Book.author_id == author_id).delete()
db.session.delete(author_obj)
db.session.commit()
except Exception as e:
print("删除作者名失败")
db.session.rollback()
else:
flash("没有这个作者")
authors = Author.query.all()
bookform = AddBookForm() return redirect(url_for('index')) @app.route("/delete_book/<book_id>")
def delete_book(book_id):
try:
# 书的对象
book_obj = Book.query.get(book_id)
print(book_obj)
# 书的作者的id
author_id = book_obj.author.id
# author_id = book_obj.Author.id
print(author_id)
if book_obj:
db.session.delete(book_obj)
author_count = len(book_obj.author.book)
if author_count == 0:
# author_obj = Author.query.get(author_id)
author_objs = Author.query.filter(Author.id == author_id).all()
print("author_obj", author_objs)
for author_obj in author_objs:
db.session.delete(author_obj) except Exception as e:
print("没有这本书")
db.session.commit() authors = Author.query.all()
bookform = AddBookForm()
return render_template("index.html", authors=authors, form=bookform) if __name__ == '__main__':
app.run(debug=True)

图书管理系统(数据库基本的操作)

 <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form method="post" action="http://127.0.0.1:5000/index">
{{ form.csrf_token() }}<br/>
{{ form.author.label }}{{ form.author }}<br/>
{{ form.book.label }}{{ form.book }}<br/>
{{ form.submit }}<br/>
{% for message in get_flashed_messages() %}
{{ message }}
{% endfor %}
</form>
<br/>
<h1>图书管理界面</h1>
<ul>
{% for author in authors %}
<li> {{ author.name }}<a href="/delete_author/{{ author.id }}">删除作者</a></li>
<ul>
{% for book in author.book %}
<li> {{ book.name }}<a href="/delete_book/{{ book.id }}">删除书名</a></li>
{% endfor %}
</ul>
{% endfor %}
</ul> </body>
</html>

前端展示代码

flask内容之数据库的管理的更多相关文章

  1. Flask系列:数据库

    这个系列是学习<Flask Web开发:基于Python的Web应用开发实战>的部分笔记 对于用户提交的信息,包括 账号.文章 等,需要能够将这些数据保存下来 持久存储的三种方法: 文件: ...

  2. Flask 操作Mysql数据库 - flask-sqlalchemy扩展

    数据库的设置 Web应用中普遍使用的是关系模型的数据库,关系型数据库把所有的数据都存储在表中,表用来给应用的实体建模,表的列数是固定的,行数是可变的.它使用结构化的查询语言.关系型数据库的列定义了表中 ...

  3. Winform开发框架中的内容及文档管理模块功能介绍

    在开发项目的时候,我们有一些场景需要编辑一些HTML文档,作为内容发布系统的一部分,有时候也需要对一些文档如WORD文档进行编辑管理,这样需要我们对这些内容及文档进行合适的管理.本文主要介绍在WInf ...

  4. flask内容

    Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收http请求并对请求进行预处理,然后 ...

  5. c#上传文件并将word pdf转化成txt存储并将内容写入数据库

    c#上传文件并将word pdf转化成txt存储并将内容写入数据库 using System; using System.Data; using System.Configuration; using ...

  6. DB2 9.5 数据库分区管理及应用实践

    DB2 数据库分区是 DB2 企业版 DPF(Data Partitioning Feature)选件提供的,它主要用来为大规模数据处理.高并发数据访问提供支持.DB2 数据库分区采用 Share-n ...

  7. 数据库智能管理助手-CloudDBA

    摘要:阿里云CloudDBA主要分为离线分析和在线分析两种功能.帮助用户节省成本,定位问题,分析原因并推荐解决方法.CloudDBA可以做到实时诊断,离线诊断和SQL优化.并且通过MySQL的参数调优 ...

  8. Database基础(一):构建MySQL服务器、 数据库基本管理 、MySQL 数据类型、表结构的调整

    一.构建MySQL服务器 目标: 本案例要求熟悉MySQL官方安装包的使用,快速构建一台数据库服务器: 安装MySQL-server.MySQl-client软件包 修改数据库用户root的密码 确认 ...

  9. Flask学习之四 数据库

    英文博客地址:http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-iv-database 中文翻译地址:http://ww ...

随机推荐

  1. webpack学习笔记--配置plugins

     Plugin Plugin 用于扩展 Webpack 功能,各种各样的 Plugin 几乎让 Webpack 可以做任何构建相关的事情. 配置 Plugin Plugin 的配置很简单, plugi ...

  2. [转] mongodb下载、安装、配置与使用

    记得在管理员模式下运行CMD,否则服务将启动失败. 详细图解,记录 win7 64 安装mongo数据库的过程.安装的版本是 MongoDB-win32-x86_64-2008plus-ssl-3.4 ...

  3. [转] Javascript中理解发布--订阅模式

    发布订阅模式介绍 发布---订阅模式又叫观察者模式,它定义了对象间的一种一对多的关系,让多个观察者对象同时监听某一个主题对象,当一个对象发生改变时,所有依赖于它的对象都将得到通知. 现实生活中的发布- ...

  4. 如何使用maven进行avro序列化

    maven导入avro: <dependency> <groupId>org.apache.avro</groupId> <artifactId>avr ...

  5. python--模拟蜂窝网(https)登陆总结

    #用户名密码登陆 1.寻找登陆请求(此处可以故意输错用户名密码,目的是为了能够看清楚重定向的地址) 发现: 点击登陆时,请求了 ①.post302:https://passport.mafengwo. ...

  6. Fstring

    题目描述 一个只包含A,B,C三种字符的字符串,如果其中有连续的3个由A,B,C各一个组成,则称为Fstring. 例如:BAACAACCBAAA就是,而AABBCCAABB则不是. 你的任务就是计算 ...

  7. List接口相对于Collection接口的特有遍历方法

    package com.hxl; import java.util.ArrayList; import java.util.List; public class Test { public stati ...

  8. Java 异常处理的重要认识

    异常类的继承结构 Exception : 一般标识的是程序中出现的问题,可以直接使用try---catch处理. Error : 一般值得是JVM错误,程序中无法处理. 检测异常类需要在throws后 ...

  9. JavaScript项目重构到底有多少坑要填要踩

    看到代码的那一刻我惊呆了,就一个js文件,接近2000行的代码.这个还好,比这个行数多的我见的多了,这个还吓不到我.有哪些问题,一会再说. 因为从我接手的那一刻算起,几天后就要发新版本,我只要也只能调 ...

  10. Python之抽象类、抽象方法

    抽象类中只能有抽象方法,子类继承抽象类时,不能通过实例化使用其抽象方法,必须实现该方法. Python2 class CopyBase(object): def save(self): raise N ...