4.alembic数据迁移工具

alembic是用来做ORM模型与数据库的迁移与映射。alembic使用方式跟git有点类似,表现在两个方面,第一个,alemibi的所有命令都是以alembic开头;

第二,alembic的迁移文件也是通过版本进行控制的。安装方式:pip install alembic

1.1.alembic的使用

 (1)定义模型

models.py

from sqlalchemy import Column,Integer,String,create_engine
from  sqlalchemy.ext.declarative import declarative_base

DB_URI = "mysql+pymysql://root:123456@127.0.0.1:3306/alembic_demo?charset=utf8"

engine = create_engine(DB_URI)

Base = declarative_base(engine)

class User(Base):
    __tablename__ = 'user'
    id = Column(Integer,primary_key=True,autoincrement=True)
    username = Column(String(50),nullable=False)

(2)在cmd终端初始化,创建一个仓库

alembic init learn_alembic

(3)修改配置文件,指定连接的数据库

alembic.ini

sqlalchemy.url = mysql+pymysql://root:123456@127.0.0.1:3306/alembic_demo?charset=utf8

(4)将models所在的目录路径添加到env.py,并指定target_metadata

import sys,os
# 1.__file__:当前文件(env.py)
#2.os.path.dirname(__file__):获取当前文件的目录
#3.os.path.dirname(os.path.dirname(__file__)):获取当前文件目录的上一级目录
#4.sys.path: python寻找导入的包的所有路径
sys.path.append(os.path.dirname(os.path.dirname(__file__)))
import models


target_metadata = models.Base.metadata

(5)生成迁移脚本

alembic revision --autogenerate -m "第一次提交"

(6)将生成的迁移脚本映射到数据库中

alembic upgrade head

以后如果想要添加或修改模型,重复5,6步骤即可

1.2.alembic常用命令和经典错误解决办法

常用命令和参数解释:

  • init:创建一个alembic仓库
  • rebision:创建一个新的版本文件
  • --autogenerate:自动将当前模型的修改,生成迁移脚本
  • -m:本次迁移做了哪些修改
  • upgrade:将指定版本的迁移文件映射到数据库中,会执行版本文件中的upgrade函数
  • head:代表当前的迁移脚本的版本号
  • downgrade:会执行指定版本的迁移文件中的downgrade函数
  • heads:展示当前可用的heads脚本文件
  • history:列出所有的迁移版本及其信息
  • current:展示当前数据库中的版本号

经典错误

1.FAILED:Target databases is not up to date.

   原因:主要是heads和current不相同。current落后于heads的版本

   解决办法:将current移动到head上。alembic upgrade head

2.FAILED:Can't locate revision identified by 'xxxxxxx'

   原因:数据库中存的版本号不在迁移脚本文件中

   解决办法:删除数据的alembic_version表中的数据,重新执行alembic upgrade head

1.3.current命令使用介绍

用alembic工具:数据库中会自动生成一张表alembic_version

在数据库中可以查看当前的版本号

在cmd终端也可以通过current命令查看

alembic current

1.4.Flask-SQLAlchemy下使用alembic

(1)config.py

DB_URI = "mysql+pymysql://root:123456@127.0.0.1:3306/flask_alembic_demo?charset=utf8"

SQLALCHEMY_DATABASE_URI = DB_URI

(2)flask_alembic_demo.py

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import config

app = Flask(__name__)
app.config.from_object(config)

db = SQLAlchemy(app)

class User(db.Model):
    __tablename__ = 'user'
    id = db.Column(db.Integer,primary_key=True,autoincrement=True)
    username = db.Column(db.String(50),nullable=False)
  

@app.route('/')
def hello_world():
    return 'Hello World!'

if __name__ == '__main__':
    app.run()

(3)初始化

alembic init alembic

(4)alembic.ini

sqlalchemy.url = mysql+pymysql://root:123456@127.0.0.1:3306/flask_alembic_demo?charset=utf8

(5)env.py

import sys,os
sys.path.append(os.path.dirname(os.path.dirname(__file__)))
import flask_alembic_demo

#用的是db.Model
target_metadata = flask_alembic_demo.db.Model.metadata

(6)生成迁移脚本

alembic revision --autogenerate -m "first commit"

(7)upgrade到数据库

alembic upgrade head

(8)添加字段

假入想添加一个字段age

class User(db.Model):
    __tablename__ = 'user'
    id = db.Column(db.Integer,primary_key=True,autoincrement=True)
    username = db.Column(db.String(50),nullable=False)
    age = db.Column(db.Integer)

重复步骤即可

alembic revision --autogenerate -m "add column age"

alembic upgrade head

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏月色的自留地

从零开始学习PYTHON3讲义(十)自己做一个“电子记事本”

截至上一讲,我们已经完成了Python语言的基本部分。我们用了三讲来讨论Python语言的控制结构,用了两讲来介绍Python的基本数据类型。可以说仅就语法和语...

22830
来自专栏机器之心

基于PyTorch的GAN框架TorchGAN:用架构级API轻松定制GAN项目

项目地址:https://github.com/torchgan/torchgan

9720
来自专栏Python疯子

通过pyCharm设置项目的环境变量:os.environ

54730
来自专栏AI科技大本营的专栏

刚发布!Python一二线城市月薪15k起!12月再夺语言榜首

在最新公布的 PYPL 12 月编程语言指数榜中,Python 以 25.36% 的份额甩开Java(21.56 %),并逐渐与 Java 拉开差距。

10310
来自专栏程序生活

2018-12-27《Pytext实战》

Hierarchical intent and slot filling 多层级意图识别

33020
来自专栏图像识别与深度学习

2018-07-04 Python 常用错误解决方法

1、TypeError: can't multiply sequence by non-int of type 'float'

68720
来自专栏华章科技

入门科普:Python、R、大数据、云计算最全学习资源都在这里

导读:本文写给有抱负的新兴数据科学家、知道各种专业知识的程序员,还有那些不懂任何编程技巧的初学者。本文提供了简单的教程和可实践的分析,而不是理论。我还试图将Py...

37720
来自专栏女程序员的日常

CentOS安装python3

yum groupinstall "Development tools" yum install zlib-devel bzip2-devel openssl...

37320
来自专栏AI科技大本营的专栏

圣诞节!教你用Python画棵圣诞树

作者 | 糖甜甜甜,985高校经管研二,擅长用 Python、R、tableau 等工具结合统计学和机器学习模型做数据分析。

49920
来自专栏AI科技大本营的专栏

Python月薪20K?这20601个岗位缺口更吸引我!

小时候看动画片《哆啦A梦》时候,特别羡慕它有个神奇百宝袋,如果自己也有那么多道具,人生不知道能美好多少倍啊!即便现在已经慢慢长大,在大学,在工作中,这些宝物都有...

14930

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励