内容简介:在开发过程中,需要修改数据库模型,而且还要在修改之后更新数据库,最直接的方式是删除旧表,但这样会丢失数据更好的就诶接办法是使用数据库迁移框架,它可以追踪数据库模型的变化,然后把变动应用的数据库中在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 迁移数据库工具》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 银行核心海量数据无损迁移:TDSQL数据库多源异构迁移方案
- 简单数据库迁移实践
- 再无需从头训练迁移学习模型!亚马逊开源迁移学习数据库 Xfer
- redis数据库迁移方案
- 用 Golang 处理数据库迁移
- 浅谈数据库同步和迁移
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。