flask框架-数据库

综合案例-图书管理系统

from flask import Flask, render_template, flash, redirect
from wtforms import StringField, SubmitField
from flask_wtf import FlaskForm
from flask_sqlalchemy import SQLAlchemy
from wtforms.validators import DataRequired

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:123456@127.0.0.1:3306/books'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.config['SECRET_KEY'] = 'shjsjdsagd29eu'
db = SQLAlchemy(app)


class Book(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64))
    author_id = db.Column(db.Integer, db.ForeignKey("author.id"))


class Author(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64))
    books = db.relationship("Book", backref="author")


class BookForm(FlaskForm):
    book_name = StringField(label='书籍名:', validators=[DataRequired('书籍名不能为空')])
    author_name = StringField(label='作者名:', validators=[DataRequired('作者名不能为空')])
    submit = SubmitField('添加')


@app.route('/')
def index():
    book_from = BookForm()
    author = Author.query.all()
    return render_template("book_show.html", book_from=book_from, author=author)


@app.route('/add_book', methods=['POST'])
def add_book():
    book_form = BookForm()
    book_name = book_form.book_name.data
    author_name = book_form.author_name.data
    author = Author.query.filter(Author.name == author_name).first()
    if author:
        if not Book.query.filter(Book.name == book_name,Book.author_id == author.id).first():
            book = Book()
            book.name = book_name
            book.author_id = author.id
            db.session.add(book)
            db.session.commit()
            flash('添加书籍成功')
        else:
            flash('添加失败,该书籍已存在')
    else:
        author = Author()
        author.name = author_name
        db.session.add(author)
        db.session.commit()
        book = Book()
        book.name = book_name
        book.author_id = author.id
        db.session.add(book)
        db.session.commit()
        flash('添加作者和书籍成功')
    return redirect('/')


if __name__ == "__main__":
    # db.drop_all()
    db.create_all()

    # au1 = Author()
    # au1.name = '老王'
    # au2 = Author()
    # au2.name = '老李'
    # au3 = Author()
    # au3.name = '老六'
    # db.session.add_all([au1, au2, au3])
    # db.session.commit()
    # book1 = Book()
    # book1.name = '从前有座山'
    # book1.author_id = au1.id
    # book2 = Book()
    # book2.name = '葫芦娃'
    # book2.author_id = au2.id
    # book3 = Book()
    # book3.name = '小金刚'
    # book3.author_id = au3.id
    # db.session.add_all([book1, book2, book3])
    # db.session.commit()

    app.run(debug=True)

./templates/book_show.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="/add_book" method="post">
    {{ book_from.csrf_token }}
    {{ book_from.book_name.label }}{{ book_from.book_name }}<br>
    {{ book_from.author_name.label }}{{ book_from.author_name }}<br>
    {{ book_from.submit }}
    <span style="color:red">
        {% for msg in get_flashed_messages() %}
            {{ msg }}
        {% endfor %}
    </span>
</form>
<h2>书籍展示</h2>
{% for a in author %}
    <ul>
        <li>作者名:{{ a.name }}</li>
        <br>
        <ul>
            <li>书籍名:
            {% for book in a.books %}
                {{ book.name }}
            {% endfor %}
            </li>
        </ul>
    </ul>
{% endfor %}

</body>
</html>

 

数据库迁移(迁移的是数据库的表结构不包含表的数据)

from flask import Flask
from flask_script import Manager
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate, MigrateCommand


app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:123456@127.0.0.1:3306/test'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.config['DEBUG'] = True
manager = Manager(app)
db = SQLAlchemy(app)
migrate = Migrate(app, db)
#使用命令python xx.py db init初始化迁移文件夹 python xx.py db migrate -m '注释'生成迁移脚本 python xx.py db upgrade/downgrade 升级数据库/降级数据库 
manager.add_command('db', MigrateCommand)


class Student(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64))
    age = db.Column(db.Integer)

    def __init__(self, name):
        self.name = name


@app.route('/index')
def index():
    return "HelloWorld"


if __name__ == "__main__":
    # db.drop_all()
    db.create_all()
    stu1 = Student('zs')
    stu2 = Student('ls')
    stu3 = Student('ww')
    db.session.add_all([stu1, stu2, stu3])
    db.session.commit()
    manager.run()

常见的数据库关系模板

一对多

class Book(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64))
    author_id = db.Column(db.Integer, db.ForeignKey("author.id"))


class Author(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64))
    books = db.relationship("Book", backref="author")

 

 

多对多

student_course = db.Table(
    "student_course",
    db.Column("student_id", db.Integer, db.ForeignKey("student.id")),
    db.Column("course_id", db.Integer, db.ForeignKey("course.id"))
)


class Student(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64))
    courses = db.relationship("Course", secondary=student_course, backref="student", lazy="dynamic")

    def __init__(self, name):
        self.name = name


class Course(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64))

    def __init__(self, name):
        self.name = name

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值