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)
相关文章:

软考之路-网络攻击:主动攻击和被动攻击
被动攻击(针对路上的东西下手) 概念:就是网络窃听,窃取数据包并进行分析,从中窃取重要的敏感信息 措施:防止被动攻击的主要手段是数据加密传输 主动攻击(针对计算机下手) 概念:包括窃取、篡改、假冒和破坏 措施&#x…
edge.js架起node.js和.net互操作桥梁
今天要介绍的是edge.js这个github上刚兴起的开源项目,它可以让node.js和.net之间在in-process下互操作。.net版本在4.5及以上,因为.net4.5带来的Task,asyn,await关键字和node.js的Event模型正好匹配。如果你感兴趣的话,…

connect() failed (111: Connection refused) while connecting to upstream, cli
php-fpm没有运行 执行如下命令查看是否启动了php-fpm,如果没有则启动你的php-fpm即可 netstat -ant | grep 9000没有运行为空,有运行显示 tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 启动方法 sudo /usr/loca…

C++的STL 栈实现 判断栈的出栈顺序是否合理
有这样的题目: 已知从1至n的数字序列,按顺序入栈,每个数字入栈后即可出栈, 也可在栈中停留,等待后面的数字入栈出栈后,该数字再出栈,求该数字序列的出栈序列是否合法? 类似如下: 已…

fire.php,Fire PHP
项目介绍: Fire PHP 是基于 PHP JavaScript开发的跨平台的Firefox 的扩充套件,即PHP调试插件,可以帮你debug 后端PHP 的程式,其使用的技术跟某些IDE 一样,要求你在写程式时加入一些追踪用的代码。通过使用Firephp你可以…

json_encode时中文编码转正常状态
function json_encode_cn($data) {$data json_encode($data);return preg_replace("/\\\u([0-9a-f]{4})/ie", "iconv(UCS-2, UTF-8, pack(H*, $1));", $data); }直接json_encode()函数 ["\u6fb3\u5927\u5229\u4e9e","\u8056\u8a95\u5cf6&q…

验证URL链接和IP有效性的JS代码(正则表达式)
千里之行,始于足下,因之前毕业设计的耽误,没能在博客园记录我的程序猿体会,稍有遗憾,这么多的时间,我竟让他转瞬而过!但没关系,再次出发,勿忘为什么出发! 一下…

[转帖]什么是光纤的波长?看看有哪些是你不知道的!
什么是光纤的波长?看看有哪些是你不知道的! FShttps://www.feisu.com/bbs/e-1640.html2017-07-01 00:00:001084我们平时最熟悉的光当然是我们肉眼所能看见的光。我们的眼睛对波长在400nm的紫光到700nm的红光很敏 感。但对于携带玻璃纤维的光纤࿰…

C++的STL 栈 实现四则运算
使用栈实现四则运算,支持,-,*,/,(,) 输入为字符串,输出为计算好的数值,如不符合四则运算的规定,则异常退出 这个实现借用了栈以及字符处理状态机的思想: 维…

javascript小数相减会出现一长串的小数位数的原因
javascript小数相减会出现一长串的小数位数的原因 <script>var a38.8;var b6.8;alert(parseFloat(a)-parseFloat(b));var a134.22;var b6;alert(a*b);</script>以上代码为什么产生一长串小数位出来,虽然比较精确,可没必要呀。这个和数据结构…

Java孩子父母类,@Output孩子和父母之间的沟通 . 角2(5)
我正在尝试学习角度2,并且我正在尝试使用来自我的子组件的数据在父组件中设置变量 . 基本上我在父视图中有一个子 Headers ,我希望 Headers 和一些HTML根据加载的子项进行更改 .父组件:import { Component, OnInit, ViewEncapsulation } from…

SQL 自学笔记1(W3School)
自学W3Schoolhttp://www.w3school.com.cn/sql/index.asp 简介 SQL是什么? Structured Query Language 结构化的查询语言 SQL能做什么? 面向数据库查询、取出数据、插入新数据、更新数据、删除数据在数据库中建立库、表;创建存储过程及视图可设…
BZOJ 1096: [ZJOI2007]仓库建设
传送门 斜率优化DP入门题 显然如果在一个位置 i 建一个仓库,且上一个仓库位置为 j 那么从 j1到 i 的物品显然都要存在 i 仓库是最优的 设 $f [ i ]$ 表示在第 i 个工厂建设仓库时,工厂 1 到 i 的物品都转移好的最小花费 考虑上一个仓库的位置 j 设工厂 i…

C++的STL 堆 实现获取数组堆第K大的数
前言 堆数据结构 使用的是优先级队列实现,创建堆的时候需要指定堆中元素的排列方式,即最大堆或者最小堆 最大堆即 堆顶元素为堆中最大的元素 最小堆即 堆顶元素为堆中最小堆元素 如下为一个最大堆 回到文章标题,获取一个数组中第K大的数&a…

HTML+CSS布局技巧及兼容问题【阅读季】
在IE6和IE7中,行高值必须大于字体的2px以上才能保证字体的完整显示或当作为链接时能显示下划线。 IE6 下去掉 input等元素 的边框 border: 0 none; 所有浏览器都可以了 边框1px {td不重叠状态}:border-collapse: collapse;(table、td需同时…

php 去掉数组相同元素,php怎么去掉数组中重复的元素
php去掉数组中重复的元素的方法:可以通过内置函数array_unique()来实现。array_unique()函数可以移除数组中重复的值并返回过滤后的数组。如果数组中存在多个相同元素,则只保留第一个值。php为我们提供了专门的内置函数array_unique()来解决此问题。该函…

Office文件的奥秘——.NET平台下不借助Office实现Word、Powerpoint等文件的解析(完)...
原文 http://www.cnblogs.com/mayswind/archive/2013/04/01/2991271.html 【题外话】 这是这个系列的最后一篇文章了,为了不让自己觉得少点什么,顺便让自己感觉完美一些,就再把OOXML说一下吧。不过说实话,OOXML真的太容易 解析了&…

Makefile (2) gdb
gdb调试 1.用debug的方式编译 -g 2.打上断点 3.单步调试 step into 进入函数里面step over 运行整个函数step return 跳出当前函数 4.继续运行 5.打印和监控值 下面是栗子: 1 #include <stdlib.h>2 #include <stdio.h>3 4 static int add(int i) //创…

C++的 STL堆 实现获取中位数
前言 堆数据结构 使用的是优先级队列实现,创建堆的时候需要指定堆中元素的排列方式,即最大堆或者最小堆 最大堆即 堆顶元素为堆中最大的元素 最小堆即 堆顶元素为堆中最小堆元素 如下为一个最大堆 中位数: 一组数排序后,如果元…

php 变更 obj,PHP: 不向后兼容的变更 - Manual
不向后兼容的变更PHP 核心中不向后兼容的变更以数组形式访问非数组尝试以数组方式访问 null,bool,int,float 或 resource(例如 $null["key"])将会抛出 notice 通知。fn 关键词fn 成为了保留关键词。需要特别注意,它不能…

正由另一进程使用,因此该进程无法访问此文件。
相信很多人都遇到过这样的问题吧 最近我的电脑似乎有点抽风了,不知道为什么控制台程序,只要使用 开始执行(不调试) 必然就残留在进程中 而且进程管理器看不到~~ 最恶心的是,就算重启VS也还是不能生成 经过一些尝试后发现在cmd中tasklist可以看到这个进程 这就好办了 使用taskki…

mysql5.6下主主复制的配置实现
两台虚拟机192.168.183.131和192.168.183.132,装完系统之后直接把所有开发包都装上 下载软件包mysql-5.6.10.tar.gz,cmake-2.8.10.2.tar.gz(从5.5开始mysql使用cmake来进行编译了而不是之前的configure) mysql的编译安装 1.首先安装cmake [ro…

RSA加密传输代码示例
RSA加密传输代码示例 涉及敏感数据的传输,双方最好约定使用加密解密。那RSA非对称加密就大有作为了。服务端可以保留自己的私钥,发给客户端对应的公钥。这样就可以互相加解密了。php中rsa加解密实现: 首先要生成一对公钥私钥。前提是linux机器…

贪心:assign cookies分糖果
贪心算法的核心: 遵循某种规律,使用最少的资源来完成目标 所以在了解贪心算法的时候需要明确两点 寻找共有的规律每一步的迭代使用最优的策略(消耗最少的资源) 问题如下: 已知一些孩子和一些糖果,每个孩…

mimo系统matlab,OFDM—MIMO系统的matlab程序
【实例简介】MIMO OFDM Simulator:OFDM.m: OFDM Simulator (outer function)create_channel.m: Generates a Rayleigh fading frequency-selective channel, parametrized by the antenna configuration, the OFDM configuration, and the power-delay profile.svd_decompose_c…

软件行业项目经理主要的职责是什么?(转)
项目经理职责:1、 基本职责就是确保项目目标的实现,领导项目团队准时、优质地完成全部工作。2、 与客户沟通,了解项目的整体需求。并与客户保持一定的联系,即时反馈阶段性的成果,和即时更改客户提出的合理需求。3、 制…

android interview 1
1. 请描述下Activity的生命周期。 必调用的三个方法:onCreate() --> onStart() --> onResume(),用AAA表示(1)父Activity启动子Activity,子Actvity退出,父Activity调用顺序如下AAA --> onF…

Spring Boot 的 10 个核心模块
学习 Spring Boot 必须得了解它的核心模块,和 Spring 框架一样,Spring Boot 也是一个庞大的项目,也是由许多核心子模块组成的。 你所需具备的基础 告诉你,Spring Boot 真是个牛逼货!Spring Boot 核心配置文件详解Sprin…

贪心:Wiggle Subsequence 摇摆序列
一个整数序列,如果两个相邻元素的差恰好正负(负正)交替出现,则该序列被称为 摇摆序列。一个小于2个元素的序列直接为摇摆序列。给一个随机序列,求这个序列满足摇摆序列定义的最长子序列的长度: 输入[1,17,5,10,13,15,10,5,16,8]&…

php 腾讯云实时音视频,腾讯云视频 -实时音视频学习日志
1、实时音视频功能h5只支持ios2、不能主动拉人建群3、pc端的demo研究整体流程可以按照腾讯音视频上面指导的步骤走,申请账号,创建应用,购买套餐。购买好套餐后然后记录sdkappid、accountType。下载密钥。在开发辅助里面有个签名(UserSig)生成…