当前位置: 首页 > 工具软件 > alembic > 使用案例 >

SQLAlchemy之alembic

湛骏祥
2023-12-01

alembic

  • alembicsqlalchemy的作者开发的,用来做OMR模型与数据库的迁移与映射,
  • alembic的所有命令都是以alembic开头,
  • alembic的迁移文件也是通过版本进行控制的,

alembic安装


pip install alembic


alembic使用

一、使用sqlalchemy创建好模型类

  • 如创建一个models.py模块,然后在里面定义需要的模型类

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创建一个仓库(初始化仓库):

  1. 打开dos系统界面

  2. cd到当前项目目录中,如果想要使用alembic,则需要先进入到安装了alembic的虚拟环境中,不然就找不到这个命令。

  3. 执行命令 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步骤


常用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:展示当前数据库中的版本号。
  • 另外,在第一次执行upgrade的时候,就会在数据库中创建一个名叫alembic_version表,这个表只会有一条数据,记录当前数据库映射的是哪个版本的迁移文件。

常见错误及解决办法

  1. 创建新版本时报错 FAILED: Target database is not up to date.
    原因:主要是heads和current不相同。current落后于heads的版本。
    解决办法:将current移动到head上。alembic upgrade head

  2. 创建新版本时报错 KeyError: ‘bb747b02cda0’ 或者 FAILED: Can’t locate revision identified by ‘a65ff5195bc0’
    原因:数据库中存的版本号不在迁移脚本文件中
    解决办法:删除versions中所有的迁移文件,删除数据库所有表。


 类似资料: