33、flask---alembic使用

alembic的使用

一、介绍和安装

       alembic是sqlalchemy作者开发的,用来做ORM模型与数据库的迁移与映射。alembic使用跟git有点类似,表现为两个方面。第一,alembic的所有命令都是以alembic开头;第二,alembic的迁移文件也是通过版本进行控制的。

       打开终端: pip install alembic

二、使用alembic的步骤

1. 定义好自己的模型。

#encoding: utf-8

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


DB_USERNAME = 'root'
DB_PASSWORD = '123456'
DB_HOST = '127.0.0.1'
DB_PORT = '3306'
DB_NAME = 'alembic_demo'

DB_URI = 'mysql+pymysql://%s:%s@%s:%s/%s?charset=utf8' % (DB_USERNAME,DB_PASSWORD,DB_HOST,DB_PORT,DB_NAME)

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)
    country = Column(String(50))


2. 使用alembic创建一个仓库:`alembic init [仓库的名字,推荐使用alembic]`。

第一步:进入该文件所在的文件目录

第二步:进入有alembic的虚拟环境中

第三步:使用alembic创建一个仓库,如:alembic init  alembic


3. 修改配置文件:
    * 在`alembic.ini`中,给`sqlalchemy.url`设置数据库的连接方式。这个连接方式跟sqlalchemy的方式一样的。

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


    * 在`alembic/env.py`中的`target_metadata`设置模型的`Base.metadata`。但是要导入`models`,需要将models所在的路径添加到这个文件中。示例代码如下: 


# 将E:\flask_learn路径添加进来
import sys, os
sys.path.append(os.path.dirname(os.path.dirname(__file__)))
import flask_learn
target_metadata = flask_learn.Base.metadata


4. 将ORM模型生成迁移脚本:`alembic revision --autogenerate -m 'message'`。


5. 将生成的脚本映射到数据库中:`alembic upgrade head`。


6. 以后如果修改了模型,重复4、5步骤。


7. 注意事项:在终端中,如果想要使用alembic,则需要首先进入到安装了alembic的虚拟环境中,不然就找不到这个命令。

3、alembic常用命令:

  1. init:创建一个alembic仓库。
  2. revision:创建一个新的版本文件。
  3. --autogenerate:自动将当前模型的修改,生成迁移脚本。
  4. -m:本次迁移做了哪些修改,用户可以指定这个参数,方便回顾。
  5. upgrade:将指定版本的迁移文件映射到数据库中,会执行版本文件中的upgrade函数。如果有多个迁移脚本没有被映射到数据库中,那么会执行多个迁移脚本。
  6. [head]:代表最新的迁移脚本的版本号。
  7. downgrade:会执行指定版本的迁移文件中的downgrade函数。
  8. heads:展示head指向的脚本文件版本号。
  9. history:列出所有的迁移版本及其信息。
  10. current:展示当前数据库中的版本号。

 

4、 alembic中出现的一些经典错误:

1. FAILED: Target database is not up to date.
    * 原因:主要是heads和current不相同。current落后于heads的版本。
    * 解决办法:将current移动到head上。alembic upgrade head
2. FAILED: Can't locate revision identified by '77525ee61b5b'
    * 原因:数据库中存的版本号不在迁移脚本文件中
    * 解决办法:删除数据库的alembic_version表中的数据,重新执行alembic upgrade head
3. 执行`upgrade head`时报某个表已经存在的错误:
    * 原因:执行这个命令的时候,会执行所有的迁移脚本,因为数据库中已经存在了这个表。然后迁移脚本中又包含了创建表的代码。
    * 解决办法:(1)删除versions中所有的迁移文件。(2)修改迁移脚本中创建表的代码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值