内容字号:默认大号超大号

段落设置:段首缩进取消段首缩进

字体设置:切换到微软雅黑切换到宋体

flask迁移数据库工具

2019-02-11 19:54 出处:清屏网 人气: 评论(0

在开发过程中,需要修改数据库模型,而且还要在修改之后更新数据库,最直接的方式是删除旧表,但这样会丢失数据

更好的就诶接办法是使用数据库迁移框架,它可以追踪数据库模型的变化,然后把变动应用的数据库中

在Flask中可以使用Flask-Migrate扩展,来实现数据迁移。并且集成到Flask-Script中,所有操作通过命令就能完成

为了到处数据库迁移命令,Flask-Migrate提供了一个MigrateCommand类,可以附加到flask-script的manager对象上

pip install flask-migrate

由于flask-migrate必须依赖于flask-script,因此需要先在pychon程序中先用flask_scrip创建中Manager对象,整个falsk应用程序都是这个Manager对象帮助我们进行维护

创建database.py 内容如下

# coding:utf-8
from falsk import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate,MigrateCommand
from flask_script import Shell,Manager

app = Flask(__name__)
manager = Manager(app)

app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:mysql@127.0.0.1:3306/Flask_test'
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
db = SQLAlchemy(app)

# 实例化一个migrate对象
# 第一个参数是Flask的实例,第二个参数是Sqlalchemy数据库实例
migrate = Migrate(app, db)

#manager是Flask-Script的实例,这条语句在flask-Script中添加一个db命令
manager.add_command('db',MigraateCommand)

# 定义模型Role
class Role(db.Model):
    # 定义表名
    __tablename__ = 'roles'
    id = db.Column(db.Integer, Primary_key=True)
    name = db.Column(db.String(64), unique=True)
    def __repr__(self):
        return 'Role:'.format(self.name)

# 定义用户
class User(db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(64), unique=True, index=True)
    def __repr__(self):
        return 'User:'.format(self.username)

if __name__ == '__main__':
    manager.run()

# 这个命令会创建migrations文件夹,所有迁移文件都放在里面

python database.py db init

下面对图书这个项目使用数据库迁移

# coding:uf-8
from flask import Flask, render_template, request,redirect, url_for, jsonfy
from flask_sqlalchemy import SQLAlchemy
from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField
from wtforms.validators import DataRequired
from flask_migrate import Migrate,MigrateCommand
from flask_script import Shell,Manager

app = Flask(__name__)
class Config(object):
    SQLALCHEMY_DATABASE_URI = "mysql://root:root@127.0.0.1:3306/author_book_py04"
    # 设置sqlalchemy自动跟踪数据库
    SQLALCHEMY_TRACK_MODIFICATIONS = True
    SECRET_KEY = "password"

app.config.from_object(Config)



# 创建flask脚本管理工具对象
manager = Manager(app, )

#创建flask管理工具对象
db = SQLAlchemy(app)

# 创建数据库迁移工具对象,不需要实例化一对象名,
# 它会自动在维护的时候会加载进app中而且跟db管理到一起
Migrate(app, db)

# 向manager对象中添加数据库的操作命令
# db是添加的命令,MigrateCommand指明db命令是什么命令
manager.add_command("db",MigrateCommand)

# 定义数据库模型
class Author(db.Model):
    __tablenale__ = "tbl_authors"
    id = db.Column(db.Integer,primary_key=True)
    name = db.Column(db.String(32), unique=True)
    books = db.relationship("Book", backref="author")

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

# 创建表单类
class AuthorbookForm(FlaskForm)
    author_name = StringField(
        label='作者',
        validators=[DataRequired('作者必填')]
    )
    book_name = StringField(
        label='书籍',
        validators=[DataRequired('书籍必填')]
    )
    submit = SubmitField(
        lable="保存"
    )


@app.route('/', methods=["POST","GET"])
def index():
    # 创建表单对象 
    form = AuthorBookForm()
    # 验证表单
    if form.validate_on_submit():
        # 提取表单数据
        author_name = form.author_name.data
        book_name = form.book_name.data
        # 保存数据库
        author = Author(name=author_name)
        db.session.dadd(author)
        db.session.commit()
        # 有两种添加书籍作者的方法
        # 一个是通过上面创建的authour对象的id添加
        # 或通过类author中的backref="author"实现
        # book = Book(name=book_name,author_id=author.id)
        book = Book(name=book_name,author=author)
        db.session.add(book)
        db.session.commit()

    # 查询数据库
    author_li = Author.query.all()
    print("author list is %s" % author_li)
    return render_template("author_book.html", authors=author_li)


# 删除书籍
@app.route('/delete_book',methods=["GET"])
def delete_book():
    # 提取参数典
    book_id = request.args.get("book_id")
    # 删除数据
    book = Book.query.get(book_id)
    db.session.delete(book)
    db.session.commit()
    return redirect(url_for("index"))



if __name__ == '__main__':
    # 通manger对象启动程序
    manager.run()

# 在终端中使用

# 初始化操作

python author_book.py db init

# 生成迁移文件

python author_book.py db migrate

# 生成迁移文件时添加描述

python author_book.py db migrate -m “迁移描述”

# 更新数据库

pyton authour_book.py db upgrade

# 查看升级历史

python author_book.py db history

# 降级

pyton authour_book.py db downgrade 状态码(history中查看)

分享给小伙伴们:
本文标签: flask数据库

相关文章

发表评论愿您的每句评论,都能给大家的生活添色彩,带来共鸣,带来思索,带来快乐。

CopyRight © 2015-2016 QingPingShan.com , All Rights Reserved.

清屏网 版权所有 豫ICP备15026204号