-
定义模型类
# coding:utf-8 from flask import Flask, render_template, request, jsonify, redirect, url_for from flask_sqlalchemy import SQLAlchemy from flask_wtf import FlaskForm from wtforms import StringField, SubmitField from wtforms.validators import DataRequired from flask_script import Manager from flask_migrate import Migrate, MigrateCommand # 创建flask实例 app = Flask(__name__) class Config(object): # 设置连接数据库的URL SQLALCHEMY_DATABASE_URI = 'mysql://root:123456@127.0.0.1:3306/db_flask_python2_author_book' # 设置sqlalchemy自动跟踪数据库 SQLALCHEMY_TRACK_MODIFICATIONS = True # 随便取个字符窜值复制给它就ok了 SECRET_KEY = "abcdef" # 把这个类添加到app设置里 app.config.from_object(Config) # 创建数据库sqlalchemy工具对象 (SQLAlchemy会自动去config把Config里的属性提取出来) db = SQLAlchemy(app) # 创建数据库迁移工具对象的步足有3步 # 1. 创建flask脚本管理工具对象 manager = Manager(app) # 2. 创建数据库迁移工具对象 Migrate(app, db) # 3. 向manager对象中添加数据库的操作命令 # 第一个参数是给这条命令取的名字叫什么,关于数据库的我们通常叫db # 第二个参数就是具体的命令 manager.add_command("db", MigrateCommand) # 定义数据库的模型 class Author(db.Model): """作者""" # 这是跟模型类取个在数据库中存在的表名, 在数据库中存在的表名为tbl_authors __tablename__ = "tbl_authors" # db.Column表示在表中真实存在的字段, db.integer int类型 primary_key设置为主键 id = db.Column(db.Integer, primary_key=True) # db.String(64) varchar类型 unique唯一标识 name = db.Column(db.String(64), unique=True) # 给Book模型类添加个字段author但是不存在数据表中, 用来简便查询 books = db.relationship("Book", backref="author") email = db.Column(db.String(64)) mobile = db.Column(db.String(64)) class Book(db.Model): """书籍""" __tablename__ = "tbl_book" id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(64), unique=True) # 外键设置那张表里面的那个字段 # 这里跟django不同, django设置外键只需填模型类这个参数, 不需要字段 # db.ForeignKey:外键 author_id = db.Column(db.Integer, db.ForeignKey("tbl_authors.id")) # 创建前端表单类 class AuthorBookForm(FlaskForm): """作者数据表单模型了""" # label:就是html标签里面的label标签 # validators:就是html标签里面的input标签 # DataRequired:确保字段中有数据 author_name = StringField(label=u"作者", validators=[DataRequired(u"作者必填")]) book_name = StringField(label=u"书籍", validators=[DataRequired(u"书籍必填")]) submit = SubmitField(label=u"提交") # post /dalete_book # {"book_id":x} # @app.route("/delete_book", methods=["post"]) # def delete_book(): # """删除书籍""" # # 提取参数 # # 如前端发送的请求体数据是json格式, get_json会解析成字典 # # get_json要求前端传送的数据的Content-Type:application/json # req_dict = request.get_json() # # # 这是传递的不是json数据时的写法 # # req_dict = json.loads(request.data) # # # 从字典中提取书本id # book_id = req_dict.get("book_id") # # # 校验参数 # try: # # 拿到的是一个对象 # book = Book.query.get(book_id) # except Exception as e: # return jsonify(res=0, errmsg="no") # # # 业务处理:删除数据 # db.session.delete(book) # db.session.commit() # # # 返回应答 # # "Content-Type":"application/json" # return jsonify(res=1, message="ok") # 用get请求方式 # /delete_book/book_id # /delete_book?book_id @app.route("/delete_book", methods=["GET"]) def delete_book(): """删除书籍""" # 提取参数 book_id = request.args.get("book_id") # 校验参数 try: # 拿到的是一个对象 book = Book.query.get(book_id) except Exception as e: return redirect(url_for("index")) # 删除 db.session.delete(book) # 提交到数据库 db.session.commit() # 返回应答 # "Content-Type":"application/json" return redirect(url_for("index")) @app.route("/", methods=["GET","POST"]) def index(): # 创建表单对象 form = AuthorBookForm() # 判断是是post还是get if form.validate_on_submit(): # 验证表单成功 # 提取数据是要有data author_name = form.author_name.data # 创建数据库对象 author = Author() # 给数据库对象属性赋值 author.name = author_name # 添加 db.session.add(author) # 保存在数据库里 db.session.commit() # 同上 book_name = form.book_name.data book = Book() book.name = book_name # 记住 这里有外件约束, 所以添加数据时, 你要把外件添加进去 # 有外键的数据库, 添加方法也跟django不一样, # flask添加偏底层, 数据库怎么添加,flask怎么添加 # django, 看到外键, 只要给对应的模型类的对象就行 book.author_id = author.id # 添加 db.session.add(book) # 提交到数据库 db.session.commit() # 查询数据库 只需要查询作者模型了, 因为在这个模型类里面有个books # 查询Author里面的所有数据 author_li = Author.query.all() return render_template("index.html", author_li=author_li, form=form) if __name__ == '__main__': # # 初始化数据, 删除所有的表 # db.drop_all() # # 创建所有的表 # db.create_all() # # 生成数据 # au_xi = Author(name='我吃西红柿') # au_qian = Author(name='萧潜') # au_san = Author(name='唐家三少') # 添加 # db.session.add_all([au_xi, au_qian, au_san]) # 提交到数据 # db.session.commit() # # 给 Book添加数据 # bk_xi = Book(name='吞噬星空', author_id=au_xi.id) # bk_xi2 = Book(name='寸芒', author_id=au_xi.id) # bk_qian = Book(name='飘渺之旅',author_id=au_qian.id) # bk_san = Book(name='冰火魔厨', author_id=au_san.id) # 添加 # db.session.add_all([bk_xi, bk_xi2, bk_qian, bk_san]) # 提交到数据 # db.session.commit() # app.run(debug=True) # 通过manager对象启动程序 manager.run() -
用manager.run() 启动时用:python py文件名 -h ip:port
-
数据库迁移命令
# flast里面的初始化(db init)db是你在py文件里取得名字 python author_book.py db init # flask里面生成数据库迁移文件的命令(db migrate)相当于django的makemigations python author_book.py db migrate python author_book.py db migrate -m 'add mobile' # -m 'add mobile' 是给生成出来的迁移文件名字 添加add mobile # flask里面往数据库里面写数据的命令(db upgrade)相当于django的migrate python author_book.py db upgrade # flask里面查看数据库执行了那些命令(防止生成迁移后, 后悔)history查看历史命令 python author_book.py db history # flask里面查看数据库执行了那些命令(防止生成迁移后, 后悔), downgrade(降级操作) 会退到fec14dc14de2 # 记住这里必须先执行history, 要不然你不知到会退到那个状态 python author_book.py db downgrade fec14dc14de2
浙公网安备 33010602011771号