flask 迁移数据库工具

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

内容简介:在开发过程中,需要修改数据库模型,而且还要在修改之后更新数据库,最直接的方式是删除旧表,但这样会丢失数据更好的就诶接办法是使用数据库迁移框架,它可以追踪数据库模型的变化,然后把变动应用的数据库中在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 迁移数据库工具》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

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

Real-Time Collision Detection

Real-Time Collision Detection

Christer Ericson / CRC Press / 2004-12-22 / USD 98.95

Written by an expert in the game industry, Christer Ericson's new book is a comprehensive guide to the components of efficient real-time collision detection systems. The book provides the tools and kn......一起来看看 《Real-Time Collision Detection》 这本书的介绍吧!

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

MD5 加密
MD5 加密

MD5 加密工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试