flask 迁移数据库工具

栏目: Python · 发布时间: 6年前

内容简介:在开发过程中,需要修改数据库模型,而且还要在修改之后更新数据库,最直接的方式是删除旧表,但这样会丢失数据更好的就诶接办法是使用数据库迁移框架,它可以追踪数据库模型的变化,然后把变动应用的数据库中在Flask中可以使用Flask-Migrate扩展,来实现数据迁移。并且集成到Flask-Script中,所有操作通过命令就能完成

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

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

在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 迁移数据库工具》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Beginning XSLT 2.0

Beginning XSLT 2.0

Jeni Tennison / Apress / 2005-07-22 / USD 49.99

This is an updated revision of Tennison's "Beginning XSLT", updated for the new revision of the XSLT standard. XSLT is a technology used to transform an XML document with one structure into another ......一起来看看 《Beginning XSLT 2.0》 这本书的介绍吧!

MD5 加密
MD5 加密

MD5 加密工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具