flask内容之数据库的管理
#! /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内容之数据库的管理的更多相关文章
- Flask系列:数据库
这个系列是学习<Flask Web开发:基于Python的Web应用开发实战>的部分笔记 对于用户提交的信息,包括 账号.文章 等,需要能够将这些数据保存下来 持久存储的三种方法: 文件: ...
- Flask 操作Mysql数据库 - flask-sqlalchemy扩展
数据库的设置 Web应用中普遍使用的是关系模型的数据库,关系型数据库把所有的数据都存储在表中,表用来给应用的实体建模,表的列数是固定的,行数是可变的.它使用结构化的查询语言.关系型数据库的列定义了表中 ...
- Winform开发框架中的内容及文档管理模块功能介绍
在开发项目的时候,我们有一些场景需要编辑一些HTML文档,作为内容发布系统的一部分,有时候也需要对一些文档如WORD文档进行编辑管理,这样需要我们对这些内容及文档进行合适的管理.本文主要介绍在WInf ...
- flask内容
Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收http请求并对请求进行预处理,然后 ...
- c#上传文件并将word pdf转化成txt存储并将内容写入数据库
c#上传文件并将word pdf转化成txt存储并将内容写入数据库 using System; using System.Data; using System.Configuration; using ...
- DB2 9.5 数据库分区管理及应用实践
DB2 数据库分区是 DB2 企业版 DPF(Data Partitioning Feature)选件提供的,它主要用来为大规模数据处理.高并发数据访问提供支持.DB2 数据库分区采用 Share-n ...
- 数据库智能管理助手-CloudDBA
摘要:阿里云CloudDBA主要分为离线分析和在线分析两种功能.帮助用户节省成本,定位问题,分析原因并推荐解决方法.CloudDBA可以做到实时诊断,离线诊断和SQL优化.并且通过MySQL的参数调优 ...
- Database基础(一):构建MySQL服务器、 数据库基本管理 、MySQL 数据类型、表结构的调整
一.构建MySQL服务器 目标: 本案例要求熟悉MySQL官方安装包的使用,快速构建一台数据库服务器: 安装MySQL-server.MySQl-client软件包 修改数据库用户root的密码 确认 ...
- Flask学习之四 数据库
英文博客地址:http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-iv-database 中文翻译地址:http://ww ...
随机推荐
- Hadoop Avro支持多输入AvroMultipleInputs
Avro 提供了1.x版本的AvroMultipleInputs,但是不支持2.x API版本,因此修改对应代码,增加对hadoop 2.x API版本的的支持 代码放在https://github. ...
- 【AtCoder】ARC075
ARC075 在省选前一天听说正式选手线画到省二,有了别的女选手,慌的一批,然后刷了一个ARC来稍微找回一点代码感觉 最后还是挂分了,不开心 果然水平退化老年加重啊 原题链接 C - Bugged 直 ...
- 【Android】Android处理Home键方法小结
实验几次之后(android4.1 和android4.2)发现在单个的activity里面有以下几个方法可以使用: 方法1:onSaveInstanceState方法 下面这个方法可以处理home的 ...
- ionic2/cordova自定义插件集成aar包
一.准备自定义插件 1. 准备:安装plugman npm install -g plugman 2. 新建组件 plugman create --name MyPlugin --plugin_id ...
- VMware安装操作系统提示 " Intel VT-x 处于禁用状态"解决方法
VMWARE WORKSTATION 在安装64为操作系统(kali)报错,报错内容为:“已将该虚拟机配置为使用 64 位客户机操作系统.但是,无法执行 64 位操作. 此主机支持 Intel VT- ...
- git之二: git可视化工具sourcetree
参考: https://www.cnblogs.com/tian-xie/p/6264104.html sourcetree安装使用
- Promise-async-await处理函数
/*function request() { // 此处的request返回的是一个Promise return new Promise((resolve, reject) => { ajax( ...
- JAVA中值类型和引用类型的不同(面试常考)
转载:https://www.cnblogs.com/1ming/p/5227944.html 1. JAVA中值类型和引用类型的不同? [定义] 引用类型表示你操作的数据是同一个,也就是说当你传一个 ...
- c++容器加迭代器和python装饰器的对比
c++利用对象实现简单数据的测试: class TestDataEmptyArray { public: static vector<int> get_array() { std::vec ...
- Beautifulsoup官方文档
Beautiful Soup 中文文档 原文 by Leonard Richardson (leonardr@segfault.org) 翻译 by Richie Yan (richieyan@gma ...