内容简介:在开发过程中,需要修改数据库模型,而且还要在修改之后更新数据库,最直接的方式是删除旧表,但这样会丢失数据更好的就诶接办法是使用数据库迁移框架,它可以追踪数据库模型的变化,然后把变动应用的数据库中在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 处理数据库迁移
- 浅谈数据库同步和迁移
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。