首页 > 数据库 >flask_migrate---处理 sqlalchemy 数据迁移的工具

flask_migrate---处理 sqlalchemy 数据迁移的工具

时间:2023-01-30 17:42:35浏览次数:53  
标签:sqlalchemy flask app db --- admin manager import


1. 什么是flask_migrate

flask_migrate 是专门用来做sqlalchemy 数据迁移的工具,当据模型发生变化的时可将修改后的模型重新映射到数据库中,这意味着数据库也将被修改。

本文介绍flask_migrate如何在flask项目中使用,所依赖的第三方库和版本信息如下

pip install flask==1.1.4
pip install flask-script==2.0.6
pip install flask_migrate==2.7.0
pip install sqlalchemy==1.4.22

2. 项目结构说明

本文用最小的项目结构来展示flask_migrate如何使用

flask_migrate---处理 sqlalchemy 数据迁移的工具_User

一共有4个python需要编写,在project目录下有app.py, config.py,models.py, 和project同级目录下需要编写manager.py

config.py

from pathlib import Path

DATABASE = "migrate.db"
basedir = Path(__file__).resolve().parent
class Config():
SQLALCHEMY_DATABASE_URI = f"sqlite:///{Path(basedir).joinpath(DATABASE)}"
SQLALCHEMY_COMMIT_ON_TEARDOWN = True
SECRET_KEY = 'secret key to protect from csrf'


@staticmethod
def init_app(app):
pass

config.py 是flask项目的配置脚本,为了方便演示,我使用sqlite数据库,SQLALCHEMY_DATABASE_URI是数据的URI配置,sqlalchemy将根据这个配置选择用哪个第三方库作为引擎。

app.py

from flask import Flask
from project.config import Config
from flask_sqlalchemy import SQLAlchemy


app = Flask(__name__)
app.config.from_object(Config)

db = SQLAlchemy()
Config.init_app(app)
db.init_app(app)

from project.models import *

@app.route('/')
def index():
admin = db.session.query(User).filter(User.username =='admin').first()
if admin is None:
return {'status': 0, 'data': {}}
else:
print(admin.name_cn)
return {'status': 1, 'data': {'username': admin.username, 'name_cn': admin.name_cn}}

app.py完成项目的初始化工作,同时提供了一个视图函数index,在index中将会返回管理员的信息。

models.py

from project.app import db
from sqlalchemy import Column, String, Integer
from werkzeug.security import generate_password_hash


class User(db.Model):
__tablename__ = 'user'
id = Column(Integer, primary_key=True, autoincrement=True)
username = Column(String(50), nullable=False)
password = Column(String(80), nullable=False)
name_cn = Column(String(20), nullable=False)

@classmethod
def add_admin(cls):
user = db.session.query(User).filter(User.username =='admin').first()
if user is None:
user = User(username='admin', password=generate_password_hash('123456'), name_cn='管理员')
db.session.add(user)
db.session.commit()

models.py 存放数据库模型,我只定义了一个user表,add_admin方法会向表中添加一个管理员。

manager.py

from flask_script import Manager, Server
from flask_migrate import MigrateCommand, Migrate, upgrade
from project.app import app, db
from project.models import *

manager = Manager(app)
migrate = Migrate(app, db)
# 子命令 MigrateCommand 包含三个方法 init migrate upgrade
manager.add_command('db', MigrateCommand)
manager.add_command('start', Server(host="0.0.0.0", port=8000, use_debugger=True)) # 创建启动命令


@manager.command
def deploy():
upgrade()
User.add_admin()


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

manager.py 负责管理项目,除了管理数据库,还有server的启动命令start和我自己创建的数据库部署命令deploy。

3. 使用方法

flask_migrate 提供了很多命令,其中最为常用的是init, migrate, upgrade,第一次将数据模型映射到数据库中时,依次执行下面三个命令

python manager.py db init
python manager.py db migrate
python manager.py db upgrade

在这以后,如果数据模型发生了变化,只需要执行migrate 和 upgrade。

执行完上述命令后,此时user表里还没有数据,执行命令

python manager.py deploy

会执行deploy函数,向user表中写入一条管理员数据,在项目初始阶段,个别的表需要预置一些数据,项目才能正常运行,这样做也可以方便测试。

最后执行命令

python manager.py start

会启动flask 服务,在浏览器里访问http://127.0.0.1:8000/ 得到如下响应

{
"data": {
"name_cn": "\u7ba1\u7406\u5458",
"username": "admin"
},
"status": 1
}


标签:sqlalchemy,flask,app,db,---,admin,manager,import
From: https://blog.51cto.com/u_15948370/6027491

相关文章

  • 闲聊flask web编程中的cookie
    在web编程中,cookie和session的区别于联系并不是一个很容易搞清楚的事情。在我从事后端工作的很长时间里,对于他们的应用也并不多,因为大多数时间都是在编写API接口供其他系统......
  • 手机测试之-monkey
    一、Monkeymonkey就是猴子, monkey测试,就像一只猴子,在电脑面前,乱敲键盘在测试,猴子什么都不懂,只知道乱敲通过Monkey程序模拟用户触摸屏幕、滑动Trackball、按键等操......
  • postcss-px-to-viewport适配屏幕大小
    1、postcss-px-to-viewport适配的介绍postcss-px-to-viewport是一个插件,用起来非常方便,安装一下插件,搞个配置文件就可以直接用了。2、postcss-px-to-viewport适配的......
  • 60、商城业务---nginx---负载均衡到网关
    1、编写nginx.conf总配置文件upstream主要是配置均衡池和调度方法server后面跟的是我们网关的ip和端口2、编写位于conf.d文件夹下的gulimall.conf中的server模块这......
  • python实战-基于正交实验(工具:allpairs)自动生成接口异常测试用例
    实现思路1.抓取api信息(目前公司用的swagger),uri、method、params、response,解析完成后写入excle2.读取抓取完毕的api信息,处理为allpairs所需要的ordereddict3.调用allpai......
  • 玩转web3第一篇——web3-react
    概况web3-react是由NoahZinsmeister开发的一个web3框架,主要功能是实时获取DApp里的关键数据(如用户当前连接的地址、网络、余额等)。Noah也是著名的去中心化交易所uniswap......
  • U盘安装RedHat 6.9_X86-64系统
    准备工作:rhel-server-6.9-x86_64-dvd.iso文件绿色版UltraISO软件;下载ISO文件:RedHatEnterpriseServer6.9forx86_64:rhel-server-6.9-x86_64-dvd.isoSHA-25......
  • Django-rest-framework框架/1-drf-drf入门规范
    一、Web应用模式在开发Web应用中,有两种应用模式:1.1前后端不分离之前学的,写的bbs项目,图书管理系统,用的是前后端混合开发。-后端人员,写后端,也要写【模板语法】--->xx.h......
  • WPF-控件的平移、旋转、镜像缩放、倾斜处理
    代码:<PathMargin="0"Width="14"Height="14"Stretch="Fill"Fill="#40568d"Data="M344576v-192L56624l288240v-192h240a3843840100-768H152v96h432a2882880......
  • 使用selenium.webdriver操作无头模式--haedless浏览器上传文件
    第一种情况Selenium官方文档的方法:文件上传|Seleniumfromseleniumimportwebdriverfromwebdriver_manager.chromeimportChromeDriverManagerdriver=webdriv......