flask通过sqlalchemy操作数据库

在这里插入图片描述

html文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>book书店</title>
</head>
<body>


<form method="POST">

    {{  form.csrf_token() }}
    {{   form.user.label }} {{  form.user  }}<br>
    {{    form.books.label }}   {{  form.books  }}<br>

    {{ form.submit}}<br>
    {% for message in get_flashed_messages() %}

        {{ message }}
    {%  endfor  %}

</form>

<hr>
{#     遍历作者信息 author 是作者表的实例  #}
<ul>{%  for author in author_form %}
        <li>{{      author.name     }}
            <a href="{{ url_for("delect_author",author_id=author.id)}}">删除</a>


        </li>
            {#      遍历 作者表中 虚拟的book 信息 然后取名字  #}
            <ul>{%  for book in author.book    %}
                 <li>{{  book.name    }}
                      {#      这里的删除超链接  传参book_id过去   #}
                         <a href="{{   url_for("delect",book_id=book.id)   }}">删除</a>
                 </li>
                {%   else   %}
                <li>无</li>
                {%  endfor  %}
            </ul>
    {%    endfor      %}
</ul>


</body>
</html>

flask 文件

#!/usr/bin/env python  
# -*- coding:UTF-8 -*-    

'''
@version: v2.7.13 
@author: dongzhiwei 
@license: Apache Licence  
@contact: 986042572@qq.com 
@site: http://blog.csdn.net/hqzxsc2006 
@software: PyCharm Community Edition 
# @FileName: book_test.py
# @Time    : 2018/10/14 16:37
'''
'''
1.关联数据库
    a.导入 sqlalchemy 扩展
    b 创建db对象 配置参数
    c.终端创建数据库
2.添加书 和作者模型
    a 模型继承model
    b 表名
    c 字段
    d relationship 关系引用
3.添加数据  网页中显示数据
4.使用模板显示数据库查询的数据
    a 查询所有作者信息 让信息传给模板文件
    b 按照格式 依次for循环作者和书籍(作者获取书籍 用的是关系引用)
5.使用WTF显示表单
6.实现相关的增删逻辑
'''
#导入请求文件 闪现flash jinja2 模板文件
from flask import Flask,render_template,request,flash,redirect,url_for
#这是 数据库相关的包文件
from flask_sqlalchemy import SQLAlchemy
#这是WTF相关的包文件  继承的表单
from flask_wtf import FlaskForm
#导入from数据类型之类的文件
from wtforms import StringField,SubmitField
#这里导入的是逻辑验证用的
from wtforms.validators import EqualTo,DataRequired


app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = "mysql+pymysql://root:123456@localhost/first_flask"
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.secret_key = 'dong'
db = SQLAlchemy(app)
'''
作者表author
id  name    虚拟books
作品表book
id  name    author_id(外键)   虚拟author

'''
class Author(db.Model):
    #定义 表名
    __tablename__ = 'authors'
    #定义字段
    id = db.Column(db.Integer,primary_key=True)
    name = db.Column(db.String(16),unique = True)
    #关系引用
    book = db.relationship('Book',backref = 'author')

    def __repr__(self):
        return "author %s" %  (self.name)



class Book(db.Model):
    __tablename__ = 'books'

    id  = id = db.Column(db.Integer,primary_key=True)
    name = db.Column(db.String(16),unique = True)
    author_id = db.Column(db.Integer,db.ForeignKey('authors.id'))

    def __repr__(self):
        return "books %s %s " % (self.name,self.author_id)
#这里定义一个表单类 用来实现继承flaskform
class book_from(FlaskForm):
    #验证 是否为空
    user = StringField('作者:',validators=[DataRequired()])
    books = StringField('作品名称:',validators = [DataRequired()])
    submit = SubmitField('提交')
#实现删除数据 < >中间是实现传参用的 url
@app.route('/delect/<book_id>')
def delect(book_id):

    #拿到bookid 如果有就删除 没有就提示
    book = Book.query.get(book_id)
    if book:
        db.session.delete(book)
        db.session.commit()
    else:
        flash("没有这条数据")


    #删除之后 需要重定向回去  这里用到 redirect
    #url_for  这里指向视图函数名 返回对应的视图路由
    return  redirect(url_for('index'))

#删除作者 如果删除作者 把书籍一起删除
@app.route('/delete_author/<author_id>')
def delect_author(author_id):

    author = Author.query.get(author_id)

    if author:
        #如果有该作者 先删除书 再删除作者
        #查询书籍 并且删除
        Book.query.filter_by(author_id=author.id).delete()
        #删除作者
        db.session.delete(author)
        db.session.commit()
        #这个时候删除书籍 是依靠
        Book.query.filter_by()

    return redirect(url_for('index'))
@app.route('/',methods=['GET','POST'])
def index():

    '''
    验证逻辑
    调用wtf 验证
    2.验证通过获取数据
    3.判断作者是否存在
    4.如果作者存在 判断书籍是否存在  没有重复就添加数据 重复就提示错误
    5.如果作者不存在 就添加作者
    6. 验证不通过就提示错误
    '''
    #查询到书籍库中作者的信息 然后传给模板
    author_form = Author.query.all()
    login_from = book_from()

    #if request == 'POST':
    #一句话验证 应该是验证上面的字符是否为空
    if login_from.validate_on_submit():
        #获取数据 判断作者是否存在filter_by
        author_name = login_from.user.data
        book_name = login_from.books.data

        author = Author.query.filter_by(name=author_name).first()

        # 如果存在 查看书籍是否存在
        if author:
            book = Book.query.filter_by(name=book_name).first()
            if book:
                # 如果存在  提示 存在
                flash('该图书存在')
            else:
                # 添加书籍
                book = Book(name=book_name, author_id=author.id)
                db.session.add(book)
                db.session.commit()

        else:
            # 添加书籍和作者
            user = Author(name=author_name)
            db.session.add(user)
            db.session.commit()
            add_book = Book(name=book_name, author_id=user.id)
            db.session.add(add_book)
            db.session.commit()

    else:
        if request.method == 'POST':

            flash('参数不完整')


    return render_template('book_test.html',author_form= author_form,form = login_from)


if __name__ == '__main__':
    db.drop_all()
    db.create_all()

    author = Author(name = '小明')
    author2 = Author(name = '小黑')
    db.session.add_all([author,author2])
    db.session.commit()

    book1 = Book(name="肖生克的救赎",author_id = author.id)
    book2 = Book(name ='flask入门',author_id = author2.id)
    book3 = Book(name="jaba web", author_id=author2.id)
    book4 = Book(name="时间简史", author_id=author.id)

    db.session.add_all([book1,book2,book3,book4])
    db.session.commit()



    app.run(debug=Tr
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值