了解flask_migrate需要先了解flask-script,那么flask-script的作用是什么呢?flask-script的作用是可以通过命令行的形式来操作Flask。例如通过命令跑一个开发版本的服务器、设置数据库,定时任务等。

2.执行pip install flask-script来进行安装。

如果直接在主manage.py中写命令,那么在终端就只需要python manage.py command_name就可以了。

如果把一些命令集中在一个文件中,那么在终端就需要输入一个父命令,比如python manage.py db init。

app.py文件

from flask import Flask

app = Flask(__name__)

@app.route('/')

def hello_world():

return 'Hello World!'

if __name__ == '__main__':

app.run()

manager.py文件

# encoding: utf-8

from flask_script import Manager

from app import app

manager = Manager(app)

@manager.command

def run():

print("服务器跑起来了")

if __name__ == '__main__':

manager.run()

在终端运行,run代表的是manager.py中的方法

python manage.py run

服务器跑起来了

flask-script我们一般和数据库在一起使用

app.py文件

#encoding: utf-8

from flask import Flask

app = Flask(__name__)

@app.route('/')

def hello_world():

return 'Hello World!'

if __name__ == '__main__':

app.run(debug=True)

manage.py文件

#encoding: utf-8

from flask import Flask

app = Flask(__name__)

@app.route('/')

def hello_world():

return 'Hello World!'

if __name__ == '__main__':

app.run(debug=True)

db_scripts.py文件

# encoding: utf-8

from flask_script import Manager

DBManager = Manager()

@DBManager.command

def init():

print('数据库初始化完成')

@DBManager.command

def migrate():

print('数据表迁移成功')

首先执行如下命令:

python manage.py db init

数据库初始化完成

再执行命令

python manage.py db migrate

数据表迁移成功

上面使用flask-script的使用以及对数据库的演示,实际开发中我们使用flask-migrate来动态的迁移数据库,使用flask-migrate必须借助flask-script。

Flask-Migrate的介绍与安装:

pip install flask-migrate

搞起!!!

migrate_demo.py文件

from flask import Flask

import config

from exts import db

app = Flask(__name__)

app.config.from_object(config)

db.init_app(app)

@app.route('/')

def hello_world():

return 'Hello World!'

if __name__ == '__main__':

app.run(debug=True)

exts.py文件

from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

config.py文件

DIALECT = 'mysql'

DRIVER = 'pymysql'

USERNAME = 'root'

PASSWORD = '123456'

HOST = '127.0.0.1'

PORT = '3306'

DATABASE = 'pythonflask'

SQLALCHEMY_DATABASE_URI = "{}+{}://{}:{}@{}:{}/{}?charset=utf8".format(DIALECT, DRIVER, USERNAME, PASSWORD, HOST, PORT,

DATABASE)

SQLALCHEMY_TRACK_MODIFICATIONS = False

models.py

from exts import db

class Article(db.Model):

__tablename__ = 'article'

id = db.Column(db.Integer, primary_key=True, autoincrement=True)

title = db.Column(db.String(100), nullable=False)

content = db.Column(db.Text, nullable=False)

manage.py,这个是最重要的文件:

from flask_script import Manager

from migrate_demo import app

from flask_migrate import Migrate,MigrateCommand

from exts import db

from models import Article

manager = Manager(app)

# 1. 要使用flask_migrate,必须绑定app和db

migrate = Migrate(app,db)

# 2. 把MigrateCommand命令添加到manager中

manager.add_command('db',MigrateCommand)

if __name__ == '__main__':

manager.run()

我们使用的是pythonflask这个数据库,里面没有任何的表和数据。

终端执行命令第一个命令:

python manage.py db init

上面的命令执行后,在我们的项目中会生成一个migrations文件夹,如下所示,versions中没有任何内容:

上面的命令执行完后,来看看数据库发生变化没有:

可以看出,此时数据库没有发生任何变化。

上面的命令成功后,执行如下命令,将模型生成迁移文件:

python manage.py db init

如下所示,versions文件夹中生成了一个文件c6439ddd759f_.py,这个就是迁移文件。

c6439ddd759f_.py:

from alembic import op

import sqlalchemy as sa

# revision identifiers, used by Alembic.

revision = 'c6439ddd759f'

down_revision = None

branch_labels = None

depends_on = None

def upgrade():

# ### commands auto generated by Alembic - please adjust! ###

op.create_table('article',

sa.Column('id', sa.Integer(), autoincrement=True, nullable=False),

sa.Column('title', sa.String(length=100), nullable=False),

sa.Column('content', sa.Text(), nullable=False),

sa.PrimaryKeyConstraint('id')

)

# ### end Alembic commands ###

def downgrade():

# ### commands auto generated by Alembic - please adjust! ###

op.drop_table('article')

# ### end Alembic commands ###

再来看看数据库发生了什么变化:

这时多了一个alembic_version文件,这个文件是迁移文件的版本号。

接下来执行最后一个命令,将迁移文件真正的映射到数据库中:

python manage.py db upgrade

查看数据库的变化:

可以看出,这个命令执行完后,数据才真正的迁移到数据库了。

现在article中我们可以看到只有如下字段:

那这时候如果我想再插入一个字段,该如何操作呢?只需要把上面的命令执行一遍就可以,但不是每个命令都执行的。

python manage.py db init:这个命令不需要执行,因为已经初始化了迁移脚本的环境,这个命令只执行一次。

python manage.py db migrate:这个命令需要执行,因为模型改变了。

python manage.py db upgrade这个命令也需要执行,每次运行了migrate命令后,就记得要运行这个命令。

增加的这个字段为“name”:

class Article(db.Model):

__tablename__ = 'article'

id = db.Column(db.Integer, primary_key=True, autoincrement=True)

title = db.Column(db.String(100), nullable=False)

name = db.Column(db.String(100), nullable=False)

content = db.Column(db.Text, nullable=False)

命令执行完后,查看数据库:

更新成功了!!!!!!!

总结如下:

介绍:因为采用db.create_all在后期修改字段的时候,不会自动的映射到数据库中,必须删除表,然后重新运行db.craete_all才会重新映射,这样不符合我们的需求。因此flask-migrate就是为了解决这个问题,它可以在每次修改模型后,可以将修改的东西映射到数据库中。

使用flask_migrate必须借助flask_scripts,这个包的MigrateCommand中包含了所有和数据库相关的命令。

flask_migrate相关的命令:

python manage.py db init:初始化一个迁移脚本的环境,只需要执行一次。

python manage.py db migrate:将模型生成迁移文件,只要模型更改了,就需要执行一遍这个命令。

python manage.py db upgrade:将迁移文件真正的映射到数据库中。每次运行了migrate命令后,就记得要运行这个命令。

注意点:需要将你想要映射到数据库中的模型,都要导入到manage.py文件中,如果没有导入进去,就不会映射到数据库中。

最后我们可以随心所欲的来对数据库进行增删改查了,简单的在article中插入一条数据,修改migrate_demo.py文件:

from flask import Flask

import config

from exts import db

from models import Article

app = Flask(__name__)

app.config.from_object(config)

db.init_app(app)

# 新增数据

@app.route('/addData')

def addData():

article = Article(title='aaaa', content='dsfsdf')

db.session.add(article)

db.session.commit()

return 'Hello World!'

@app.route('/')

def hello_world():

return 'Hello World!'

if __name__ == '__main__':

app.run(debug=True)

c语言动态迁移mysql,flask-migrate动态迁移数据库相关推荐

  1. SQLAlchemy 基础知识 - (autoflush 和 autocommit)(relationship 和 backref)(flask migrate迁移数据)

    全栈工程师开发手册 (作者:栾鹏) python教程全解 SQLAlchemy 基础 下面是一段官方 SQLAlchemy 使用示例,我们从这个例子出发,认识 SQLAlchemy. from sql ...

  2. Flask——migrate实现数据库迁移

    migrate实现数据库迁移的指令如下: 指令 代码 说明 初始化 python 文件名.py db init 这个命令会创建migrations文件夹,所有迁移文件都放在里面 创建迁移脚本 pyth ...

  3. mysql中将列动态转换为行,mysql 行转列 MySQL数据库动态行转列

    想把mysql一个表的行转成列,图1是原表,想实现图2的样式SELECT MAX(CAS就是一个动态的行列转换 CREATE TABLE `c_wssb_zz` ( `aa011` varchar(1 ...

  4. .NET 使用 MySql.Data.dll 动态库操作MySql的帮助类--MySqlHelper

    .NET 使用 MySql.Data.dll 动态库操作MySql的帮助类--MySqlHelper 參考演示样例代码,例如以下所看到的: /// <summary>/// MySql 数 ...

  5. R语言可视化散点图、气泡图、动态气泡图、数据点重合的散点图、数据点计数图、抖动数据点图、基于lm方法或者loess方法拟合数据点之间的趋势关系曲线、自定义数据点的大小、色彩、添加主标题、副标题、题注

    R语言可视化散点图.气泡图.动态气泡图.数据点重合的散点图.数据点计数图.抖动数据点图.基于

  6. 【C 语言】动态库封装与设计 ( 动态库调用环境搭建 | 创建应用 | 拷贝动态库相关文件到源码路径 | 导入头文件 | 配置动态库引用 | 调用动态库中的函数 )

    文章目录 一.在 Visual Studio 2019 中创建 " 控制台应用 " 程序 二.拷贝 xxx.lib.xxx.dll.xxx.h 到源码路径 三.导入 xxx.h 头 ...

  7. 梓益C语言学习笔记之链表&动态内存&文件

    梓益C语言学习笔记之链表&动态内存&文件 一.定义: 链表是一种物理存储上非连续,通过指针链接次序,实现的一种线性存储结构. 二.特点: 链表由一系列节点(链表中每一个元素称为节点)组 ...

  8. 动态编译MySQL plugin

    经常会有人问安装完了mysql,但是以前没有安装XXX 引擎,现在需要在线动态加载. 对于此问题我自根据自己的工作总结了下: 1.使用源码编译的,默认innobase没有被编译进来:使用二进制包安装的 ...

  9. 写MySQL存储过程实现动态执行SQL

    写MySQL存储过程实现动态执行SQL --存储过程名和参数,参数中in表示传入参数,out标示传出参数,inout表示传入传出参数create procedure p_procedurecode(i ...

最新文章

  1. vue element-ui Notification 挤在一起,重叠问题 解决办法
  2. Jasperreport导出pdf内容展示不完全处理
  3. 能上qq打不开网页,金山毒霸帮你解决
  4. 在桌面应用程序与Web应用程序之间该如何选择
  5. 使用squid代理时出现“The requested URL could not be retrieved”
  6. NTP时间服务器实现Linux时间同步
  7. RocketMq : 消费消息的两种方式 pull 和 push
  8. Linear Algebra - Determinant(几何意义)
  9. multiprocessing.manager管理的对象需要加锁吗_【极客思考】设计模式:你确定你真的理解了单例模式吗?...
  10. 用友中标:打造新一代云化ERP 落地大型企业互联网+
  11. spring3 运行起来(即做个demo)所需要的jar包
  12. Windows10操作系统共享文件夹给VMWare虚拟机centos 7 操作系统使用
  13. 语音合成学习(一)综述
  14. Linux 系统licence,Linux系统中软件简单License的实现
  15. 语言学习游戏的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  16. 判断二极管导通例题_通信电源 | 1个二极管是如何改变电流的?
  17. 创业赢利模式之一 鱼模式
  18. SpringBoot再回首:SpringBoot之Servlet用法
  19. android登陆按钮图片素材,Android精美登录界面设计
  20. 红图新媒体-新媒体,是网络营销过程中的工具

热门文章

  1. Unity从零开始构建能力体系 Unity Ability System
  2. Windows下Qt程序打包
  3. TS - 处理故障的一些通用方法
  4. LeetCode 1021:Remove Outermost Parentheses
  5. 矢量图面层和线层相交得到相交后的线层文件(gis相交)
  6. Angular4.0从入门到实战打造在线竞拍网站学习笔记之四--数据绑定管道
  7. 转载 iOS js oc相互调用(JavaScriptCore) --iOS调用js
  8. VirtualBox上Ubuntu 共享文件夹
  9. NDK 提示undefined reference to xxx“的解决办法
  10. SQL压力测试用的语句和相关计数器