c语言动态迁移mysql,flask-migrate动态迁移数据库
了解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动态迁移数据库相关推荐
- SQLAlchemy 基础知识 - (autoflush 和 autocommit)(relationship 和 backref)(flask migrate迁移数据)
全栈工程师开发手册 (作者:栾鹏) python教程全解 SQLAlchemy 基础 下面是一段官方 SQLAlchemy 使用示例,我们从这个例子出发,认识 SQLAlchemy. from sql ...
- Flask——migrate实现数据库迁移
migrate实现数据库迁移的指令如下: 指令 代码 说明 初始化 python 文件名.py db init 这个命令会创建migrations文件夹,所有迁移文件都放在里面 创建迁移脚本 pyth ...
- mysql中将列动态转换为行,mysql 行转列 MySQL数据库动态行转列
想把mysql一个表的行转成列,图1是原表,想实现图2的样式SELECT MAX(CAS就是一个动态的行列转换 CREATE TABLE `c_wssb_zz` ( `aa011` varchar(1 ...
- .NET 使用 MySql.Data.dll 动态库操作MySql的帮助类--MySqlHelper
.NET 使用 MySql.Data.dll 动态库操作MySql的帮助类--MySqlHelper 參考演示样例代码,例如以下所看到的: /// <summary>/// MySql 数 ...
- R语言可视化散点图、气泡图、动态气泡图、数据点重合的散点图、数据点计数图、抖动数据点图、基于lm方法或者loess方法拟合数据点之间的趋势关系曲线、自定义数据点的大小、色彩、添加主标题、副标题、题注
R语言可视化散点图.气泡图.动态气泡图.数据点重合的散点图.数据点计数图.抖动数据点图.基于
- 【C 语言】动态库封装与设计 ( 动态库调用环境搭建 | 创建应用 | 拷贝动态库相关文件到源码路径 | 导入头文件 | 配置动态库引用 | 调用动态库中的函数 )
文章目录 一.在 Visual Studio 2019 中创建 " 控制台应用 " 程序 二.拷贝 xxx.lib.xxx.dll.xxx.h 到源码路径 三.导入 xxx.h 头 ...
- 梓益C语言学习笔记之链表&动态内存&文件
梓益C语言学习笔记之链表&动态内存&文件 一.定义: 链表是一种物理存储上非连续,通过指针链接次序,实现的一种线性存储结构. 二.特点: 链表由一系列节点(链表中每一个元素称为节点)组 ...
- 动态编译MySQL plugin
经常会有人问安装完了mysql,但是以前没有安装XXX 引擎,现在需要在线动态加载. 对于此问题我自根据自己的工作总结了下: 1.使用源码编译的,默认innobase没有被编译进来:使用二进制包安装的 ...
- 写MySQL存储过程实现动态执行SQL
写MySQL存储过程实现动态执行SQL --存储过程名和参数,参数中in表示传入参数,out标示传出参数,inout表示传入传出参数create procedure p_procedurecode(i ...
最新文章
- vue element-ui Notification 挤在一起,重叠问题 解决办法
- Jasperreport导出pdf内容展示不完全处理
- 能上qq打不开网页,金山毒霸帮你解决
- 在桌面应用程序与Web应用程序之间该如何选择
- 使用squid代理时出现“The requested URL could not be retrieved”
- NTP时间服务器实现Linux时间同步
- RocketMq : 消费消息的两种方式 pull 和 push
- Linear Algebra - Determinant(几何意义)
- multiprocessing.manager管理的对象需要加锁吗_【极客思考】设计模式:你确定你真的理解了单例模式吗?...
- 用友中标:打造新一代云化ERP 落地大型企业互联网+
- spring3 运行起来(即做个demo)所需要的jar包
- Windows10操作系统共享文件夹给VMWare虚拟机centos 7 操作系统使用
- 语音合成学习(一)综述
- Linux 系统licence,Linux系统中软件简单License的实现
- 语言学习游戏的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
- 判断二极管导通例题_通信电源 | 1个二极管是如何改变电流的?
- 创业赢利模式之一 鱼模式
- SpringBoot再回首:SpringBoot之Servlet用法
- android登陆按钮图片素材,Android精美登录界面设计
- 红图新媒体-新媒体,是网络营销过程中的工具
热门文章
- Unity从零开始构建能力体系 Unity Ability System
- Windows下Qt程序打包
- TS - 处理故障的一些通用方法
- LeetCode 1021:Remove Outermost Parentheses
- 矢量图面层和线层相交得到相交后的线层文件(gis相交)
- Angular4.0从入门到实战打造在线竞拍网站学习笔记之四--数据绑定管道
- 转载 iOS js oc相互调用(JavaScriptCore) --iOS调用js
- VirtualBox上Ubuntu 共享文件夹
- NDK 提示undefined reference to xxx“的解决办法
- SQL压力测试用的语句和相关计数器