flask-admin章节三:数据库迁移工具 alembic初步使用
1. 概述
基于flask框架构建web,一般会使用sqlchemy(在flask中使用sqlchemy可以参考这里)作为数据库引擎。
这样业务的逻辑就可以做到不跟具体的数据库类型相耦合,具体后端业务是使用那种数据库就全凭业务需要了。
但是数据表结构并不一定是一成不变的,可能随着业务的需要表的结构经常会变换。面对这种情况,单纯删除之前的表,
重新再建新的表会导致数据的丢失,如果自己迁移又比较麻烦。以为,自己迁移的话,可能只能切到比较新的版本,但是
想要回滚到之前的版本几乎是不可能的,这样涉及到使用数据库迁移工具了。
针对flask,有两个比较重要的数据库迁移工具:flask migrate和alembic。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。具体在使用过程中一般指向的是上一个版本,具体
在回滚过程中非常有用。默认情况下upgrade和downgrade都会空。
在数据库升级或者回滚过程中必须要重写这这个函数,如果要升级就需要重写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初步使用的更多相关文章
- Flask学习笔记:数据库迁移操作flask-script+alembic/flask-migrate
数据库迁移是将代码中模型类(即表)的修改同步到数据库中, flask-sqlalchemy的模型类一旦使用create_all()映射到数据库中后,对这个模型类的修改(例如添加了一个新的字段)就不会再 ...
- flask 使用Flask-Migrate迁移数据库(创建迁移环境、生成迁移脚本、更新数据库)
使用Flask-Migrate迁移数据库 在开发时,以删除表再重建的方式更新数据库简单直接,但明显的缺陷是会丢掉数据库中的所有数据.在生产环境下,没有人想把数据都删除掉,这时需要使用数据库迁移工具来完 ...
- tornado-版本迁移工具alembic
pip install pymysql pip install sqlalchemy pip install alembic 1.connect db_config.py #coding=utf-8 ...
- Flask 学习(三)模板
Flask 学习(三)模板 Flask 为你配置 Jinja2 模板引擎.使用 render_template() 方法可以渲染模板,只需提供模板名称和需要作为参数传递给模板的变量就可简单执行. 至于 ...
- flask学习笔记(-操作数据库)
Python 数据库框架 大多数的数据库引擎都有对应的 Python 包,包括开源包和商业包.Flask 并不限制你使用何种类型的数据库包,因此可以根据自己的喜好选择使用 MySQL.Postgres ...
- flask admin学习记录
flask admin是flask框架中一个非常好用的后台管理框架,但是由于文档内容太少,经常遇到问题无法解决,这里记录一下 一简单的使用 from flask import Flask from f ...
- PHP系列 | ThinkPHP5数据库迁移工具 migration
了解更多,请关注微信公众号 ThinkPHP5数据库迁移工具 migration 什么是Migration? migration用谷歌翻译是移民的意思,在PHP中我们将它理解为迁移,将Migratio ...
- Flask开发系列之数据库操作
Flask开发系列之数据库操作 Python数据库框架 我们可以在Flask中使用MySQL.Postgres.SQLite.Redis.MongoDB 或者 CouchDB. 还有一些数据库抽象层代 ...
- mysql数据库连接池使用(三)数据库元数据信息反射数据库获取数据库信息
1.1. mysql数据库连接池使用(三)数据库元数据信息反射数据库获取数据库信息 有时候我们想要获取到数据库的基本信息,当前程序连接的那个数据库,数据库的版本信息,数据库中有哪些表,表中都有什么字段 ...
随机推荐
- java学习第16天(补充可变参数)
如果我们在写方法的时候,参数个数不明确,就应该定义可变参数. 格式: 修饰符 返回值类型 方法名(数据类型... 变量) {} 注意: A:该变量其实是一个数组名 B:如果一个方法有多个参数,并且有可 ...
- android第二天(项目的组成结构)
1:src文件夹分析: helloWorld----src(源码文件夹) MainActivity:主界面类----gen(自动生成的源码文件夹) R.java:对应res文件夹 下面又包含三个内部类 ...
- 代理模式(Proxy pattern)
代理模式(proxy pattern):作用:为其他对象提供一种代理,以控制对这个对象的访问.代理对象在客户端对象和目标对象之间起中介的作用. 代理模式涉及到的角色: 抽象角色:声明真实对象和代理对象 ...
- 修改tomcat应用日志默认编码格式
前言 今天开发跟我说tomcat日志中的中文不能正常显示,根据以往的经验,我觉得可能跟服务器的编码有关,于是尝试各种方法,但还是没能解决问题. 后来我突然想到会不会跟tomcat的设置有关呢,于是在网 ...
- 转:python中对list去重的多种方法
对一个list中的新闻id进行去重,去重之后要保证顺序不变. 直观方法 最简单的思路就是: ids = [1,2,3,3,4,2,3,4,5,6,1] news_ids = [] for id in ...
- 如何用grunt压缩文件
grunt-cli 全局装完之后,就可以给每个项目装grunt了. 1.先把package.json和Gruntfile.js拷到项目下(PS:这两个文件是每个项目装grunt的时候必带的) 2. ...
- Python全栈开发day9
一.面向对象进阶 1.利用python反射查看面向对象成员 对于对象:反射既可以找对象,类的成员 对于类:反射只能找类中的成员 2.利用反射操作模块(查找类,创建对象,查找对象中字段) 1 2 3 4 ...
- SQL SELECT 语句
本章讲解 SELECT 和 SELECT * 语句. SQL SELECT 语句 SELECT 语句用于从表中选取数据. 结果被存储在一个结果表中(称为结果集). SQL SELECT 语法 SE ...
- subversion(SVN)常规使用
语法: svn <subcommand> [options] [args] 使用“svn help <subcommand>” 显示子命令的帮助信息. 使用 ...
- NDO to PNP( ndoutils to PNP4Nagios)
How to use this script The aim of this script is to import your ndo database directly into PNP4nagio ...