alembic
是sqlalchemy
的作者开发的,用来做OMR
模型与数据库的迁移与映射,alembic
的所有命令都是以alembic开头,alembic
的迁移文件也是通过版本进行控制的,
pip install alembic
一、使用sqlalchemy创建好模型类
from sqlalchemy import Column,String,Integer,create_engine
from sqlalchemy.ext.declarative import declarative_base
HOSTNAME = '127.0.0.1'
PORT = '3306'
DATABASE = 'alembic_demo'
USERNAME = 'root'
PASSWORD = 'root'
DB_URI ="mysql+pymysql://{username}:{password}@{host}:{port}/{db}?charset=utf8".format(username=USERNAME,password=PASSWORD,host=HOSTNAME,port=PORT,db=DATABASE)
engine = create_engine(DB_URI)
Base = declarative_base(engine)
class User(Base):
__tablename__ = 'user'
id = Column(Integer,primary_key=True,autoincrement=True)
uname = Column(String(50),nullable=False)
country = Column(String(50))
二、使用alembic创建一个仓库(初始化仓库):
打开dos系统界面
cd
到当前项目目录中,如果想要使用alembic,则需要先进入到安装了alembic的虚拟环境中,不然就找不到这个命令。
执行命令 alembic init [仓库的名字,推荐使用alembic]
.
三、 修改配置文件:
alembic.ini
中,给sqlalchemy.url
项设置数据库的连接方式。方式跟sqlalchemy
的方式是一样的。
sqlalchemy.url = driver://user:pass@localhost/dbname
sqlalchemy.url = mysql+pymysql://root:root@localhost/alembic_demo?charset=utf8
为了使用模型类更新数据库,需要在alembic/env.py
文件中设置target_metadata项,默认为target_metadata=None。
将target_metadata
的值设置为模型Base.metadata
,但是要导入models
。
使用sys
模块和os
模块把当前项目的路径导入到path
中:
import sys,os
sys.path.append(os.path.dirname(os.path.dirname(__file__)))
import models
target_metadata
项操作为:
target_metadata = models.Base.metadata
四、自动生成迁移文件:
alembic revision --autogenerate -m
"提示信息"将当前模型中的状态生成迁移文件。五、将生成的迁移文件映射到数据库中:
使用alembic upgrade head
将刚刚生成的迁移文件,真正映射到数据库中。
如果要降级,使用alembic downgrade head
。
六、以后如果修改了模型,重复4、5步骤
创建新版本时报错 FAILED: Target database is not up to date.
原因:主要是heads和current不相同。current落后于heads的版本。
解决办法:将current移动到head上。alembic upgrade head
创建新版本时报错 KeyError: ‘bb747b02cda0’ 或者 FAILED: Can’t locate revision identified by ‘a65ff5195bc0’
原因:数据库中存的版本号不在迁移脚本文件中
解决办法:删除versions中所有的迁移文件,删除数据库所有表。