flask-admin章节三:数据库迁移工具 alembic初步使用

摘要:
flask有两个重要的数据库迁移工具:flaskmigrate和alembic。您可以在flaskapplication的目录中执行“alembic current”来查看当前数据库的版本,或者使用“alembic-history”来查看数据库更改的历史。

1. 概述

基于flask框架构建web,一般会使用sqlchemy(在flask中使用sqlchemy可以参考这里)作为数据库引擎。

这样业务的逻辑就可以做到不跟具体的数据库类型相耦合,具体后端业务是使用那种数据库就全凭业务需要了。

但是数据表结构并不一定是一成不变的,可能随着业务的需要表的结构经常会变换。面对这种情况,单纯删除之前的表,

重新再建新的表会导致数据的丢失,如果自己迁移又比较麻烦。以为,自己迁移的话,可能只能切到比较新的版本,但是

想要回滚到之前的版本几乎是不可能的,这样涉及到使用数据库迁移工具了。

针对flask,有两个比较重要的数据库迁移工具:flask migratealembic。flask migrate是基于alembic,但是个人

感觉flask migrate不够灵活,而且使用alembic还是比较方便的。所以,我这边是直接使用alembic来做为数据库迁移工具的。

首先,稍微介绍下alembic,alembic是sqlchemy作者一手缔造的,对sqlchemy的兼容性肯定是其他组件根本无法媲美的。

2. 安装

安装alembic还是蛮方便的,直接使用python安装工具pip就可以了,具体命令如下:

sudo pip install alembic

 

3. 初始化

回到flask application所处目录,执行如下命令:

alembic init alembic

执行成功之后,就能在当前目录看到两个比较重要的文件:alembic.ini文件和alembic目录。

alembic.ini保存的是alembic的配置信息,而数据库版本信息的记录是在alembic目录下。

alembic目录的机构如下:

[root@localhost alembic]# ls -trlh
total 16K
-rw-r--r-- 1 root root   38 May 11 19:36 README
-rw-r--r-- 1 root root  494 May 11 19:36 script.py.mako
-rw-r--r-- 1 root root 2.1K May 12 02:43 env.py
drwxr-xr-x 2 root root 4.0K May 12 18:53 versions

这块起作用的有两个,一个是env.py文件以及versions目录。

env.py记录着跟环境有关的一些信息,比较起作用的是target_metadata这个字段,后面在介绍使用的时候会提到。

versions目录下面是记录当前数据库所有版本,以及对应操作的python文件。

每个文件内容大致如下:

"""empty message

Revision ID: 27c6a30d7c24
Revises: None
Create Date: 2011-11-08 11:40:27.089406

"""

# revision identifiers, used by Alembic.
revision = '27c6a30d7c24'
down_revision = None

from alembic import op
import sqlalchemy as sa

def upgrade():
    pass

def downgrade():
    pass

revision字段记录的是当前文件代表的版本,初始时down_revision为None。具体在使用过程中一般指向的是上一个版本,具体

在回滚过程中非常有用。默认情况下upgradedowngrade都会空。

在数据库升级或者回滚过程中必须要重写这这个函数,如果要升级就需要重写upgrade函数,回滚就需要重写downgrade函数。

4. 一个简答的例子

首先必须更改alembic.ini文件中的sqlalchemy.url字段,改为你目前在使用的数据路径就OK了。

此处,我是改为:

sqlalchemy.url = sqlite:////home/dashuju/admin_db.sqlite

这个文件其他字段可以暂时不用更改,目前的设置就可以使用了。

更改alembic目录下的env.py文件,主要是设置target_metadata这个字段:

import sys
sys.path.append('.')
from admin_app import db

target_metadata = db.metadata

admin_app是flask application的文件名,db是在flask_app定义的全局变量,

具体初始化为:db = SQLAlchemy(app)

更改下versions目录下的当前版本py文件,并根据对应的upgrade和downgrade函数,具体代码如下:

def upgrade():
    op.create_table(
        'users',
        sa.Column('id', sa.Integer, primary_key=True),
        sa.Column('name', sa.String(50), nullable=False),
        sa.Column('description', sa.Unicode(200)),
    )

def downgrade():
    op.drop_table('users')

执行:

alembic upgrade head

指令来升级数据库,查看对应的数据库,可以看到数据库中多了一个users表。

查看versions目录下的文件,会发现多了一个py文件。可以在flask application所在目录执行:

alembic current来查看当前数据库所处版本,也可以使用alembic history来查看数据库变更的历史记录。

如果想要回滚,也可以使用alemibic downgrade -1指令来回滚数据库到之前的版本。

更改表结构

对于想要更改表结构,比如插入column或者删除column,删除column可能特殊些,所以要讲下:

插入行,一般如下:

op.add_column('users', sa.Column('id', sa.INTEGER(), nullable=True))

删除行,可能特殊些,具体如下:

with op.batch_alter_table('users') as batch_op:
        batch_op.drop_column('id')
       

想要删除多列,可以在with语句下增加多行就可以了,否则会报错:

sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) near "DROP": syntax error [SQL: u'ALTER TABLE posts DROP COLUMN XXX']

5. 后续

alembic的使用还在继续,刚接触,记录下。

免责声明:文章转载自《flask-admin章节三:数据库迁移工具 alembic初步使用》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇vue实用技巧eclipse修改Android工程图标显示下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

转:用jupyter notebook打开指定目录下的.ipynb文件

如果直接用命令行或者用快捷方式打开jupyter,默认的环境是anaconda的默认root环境,且打开的目录是默认的工作目录,不是我们的目标目录。 要想用jupyter打开的目录是目标目录,共有两个方法,一个是可以修改jupyter的默认工作目录路径,另一个是用命令行进入指定目录,然后切换到指定的环境,然后启动jupyter,就可以在网页里显示指定目录并...

java中的vo 、dto 、dao--转

 java中的vo 、dto 、dao--转 原文地址:http://yinchunjian.iteye.com/blog/758196 O是跟数据库里表的映射,一个表对应一个VO DAO是用VO来访问真实的表,对数据库的操作都在DAO中完成 BO是业务层,做逻辑处理的 VO , PO , BO , QO, DAO ,POJO, O/R Mappin...

.Net Core + DDD基础分层 + 项目基本框架 + 个人总结

为什么要写这篇文章 1,在大半年前,公司开发任务比较轻松,自己不知道干什么,但是又想要学习技术,比较迷茫,后面我接触到了博客园,看了一个帖子,深有感触,我当时不知道学习什么,于是我信息给他,他居然回复我了,并且还给我建议学习的方向,以及学习的方法,我十分的感谢他。 2,在一次面试中,有人问我,你工作1年多了有没有做过自我总结,你觉得你的优势是什么,我当时吞...

(转)淘淘商城系列——Redis持久化方案

http://blog.csdn.net/yerenyuan_pku/article/details/72858975 Redis中设置key的过期时间 Redis中的expire命令用于设置key的过期时间,以毫秒计。key过期后将不再可用。Redis中的expire命令基本语法如下: expire key second 设置成功返回1。当key不存在或...

.NET Core前后端分离快速开发框架(Core.3.1+AntdVue)

.NET Core前后端分离快速开发框架(Core.3.1+AntdVue) 引言 简介 环境搭建 开发环境要求: 基础数据库构建: 数据库设计规范 运行 使用教程 系统配置 快速开发 管理员登录 系统用户管理 系统角色管理 权限管理 接口秘钥管理 系统日志 操作日志 事务使用 读写分离分库分表 常见疑问 如何进行联表查询 如何切换数据库...

一些基本的Oracle命令

一些基本的Oracle命令基本命令 连接数据库 C:>SQLPLUS /NOLOG SQL>CONN / AS SYSDBA 1.Oracle 关闭 SQL>SHUTDOWN (ABORT|IMMEDIATE|NORMAL) 2.Oracle 启动 SQL>STARTUP (REMOUNT|MOUNT|OPENT) 3.SQL>...