• alembic_SQLAlchemy的迁移工具


    简介

    alembic是SQLAlchemy作者编写的控制 model 版本的模块,配合SQLAlchemy使用更佳, alembic的用法有点类似于git, 可以理解为ORM与数据库的版本管理工具

    安装

    在项目的虚拟环境中安装

    pip install alembic
    

    初始化

    # 进入项目目录
    cd yourproject
    # 执行初始化命令
    alembic init alembic
    

    初始化后, 会在项目目录中新增一个alembic文件夹和alembic.ini文件

    image-20210505182705004

    修改 alembic.ini

    alembic.ini文件是alembic的配置文件, 具体每个配置项的含义可以查看官方文档: 教程— Alembic 1.6.0文档 (sqlalchemy.org)

    这里我们只需要修改sqlalchemy.url这一项即可, 把SQLAlchemy中创建engine的数据库连接复制进来即可:

    sqlalchemy.url = mysql+pymysql://root:password@47.102.114.xx/cy_account
    

    注: 这里的驱动不能使用aiomysql, 若使用了则会报错

    创建模型类

    models文件夹下创建文件base_model.py

    from sqlalchemy.orm import declarative_base
    from sqlalchemy import Column, Integer, String
    
    Base = declarative_base()
    class User(Base):
        __tablename__ = 'user'
        user_id = Column(Integer, primary_key=True)
        user_name = Column(String(20))
    

    修改alembic的env.py

    修改target_metadata这一项, 把原来的None改为上面模型类使用Base.metadata

    # 官方注释
    # add your model's MetaData object here
    # for 'autogenerate' support
    # from myapp import mymodel
    # target_metadata = mymodel.Base.metadata
    # 默认配置
    # target_metadata = None
    # 修改后配置
    from models import base_model
    target_metadata = base_model.Base.metadata
    

    修改这一项的作用是把模型类和alembic关联起来, 这样alembic就可以检测到模型类的修改, 并自动生成对应的修改sql语句

    进行迁移(后续修改模型类后也都需要迁移)

    生成迁移文件

    alembic revision --autogenerate -m 'init'
    

    可以在下方的打印结果中, 看到检测到了新增表user

    # 打印结果
    INFO  [alembic.runtime.migration] Context impl MySQLImpl.
    INFO  [alembic.runtime.migration] Will assume non-transactional DDL.
    INFO  [alembic.autogenerate.compare] Detected added table 'user'
      Generating /mnt/d/study/python/projects/cy_account/alembic/versions/22456fa02b62_init.py ...  done
    

    同时在alembic目录下的versions中新增了一个文件22456fa02b62_init.py, 这就是生成的迁移文件, 可以理解为对应的建表sql

    也可以把这条命令理解为git的commit命令, 只是在本地生成了一个版本, 那么还需要push到远程才能完成提交

    提交至数据库

    alembic upgrade head
    
    # 打印结果
    INFO  [alembic.runtime.migration] Context impl MySQLImpl.
    INFO  [alembic.runtime.migration] Will assume non-transactional DDL.
    INFO  [alembic.runtime.migration] Running upgrade  -> 22456fa02b62, init
    

    运行完成后, 再去数据库查看可以看到新添加了两张表, 一张alembic_version是alembic用来做版本控制的, 另一张则是我们的模型了类对应的表user

    多个模型类文件时

    修改模型类文件

    上面我们只创建了一个模型类文件base_model, 在里面定义了user表, 如果我们项目比较大, 有多个模块, 想把每个模块的模型类都定义在不同的py文件中, 如这里有用户模块和订单模块, 分别对应用户模型类users.pyorders.py

    # users.py, 把上面base_model中定义User移动到这里定义
    from sqlalchemy import Column, Integer, String
    from models.base_model import Base
    class User(Base):
        __tablename__ = 'user'
        user_id = Column(Integer, primary_key=True)
        user_name = Column(String(20))
    
    # orders.py
    from sqlalchemy import Column, Integer, String
    from models.base_model import Base
    
    class Order(Base):
        __tablename__ = 'order'
        order_id = Column(Integer, primary_key=True)
        order_num = Column(String(20))
    

    同时还需要在base_model.py中导入上面定义的两个模型类文件才行, 否则alembic检测不到模型类

    # base_model.py
    from sqlalchemy.orm import declarative_base
    Base = declarative_base()
    # 注意先创建Base, 再导入模型类文件
    from models import users
    from models import orders
    

    进行迁移

    # 生成迁移文件
    alembic revision --autogenerate -m 'xxxx'
    # 提交至数据库
    alembic upgrade head
    
  • 相关阅读:
    POJ
    CodeForces
    部分和问题
    NOIP200502校门外的树
    消灭虫子
    抓牛
    最长不下降子序列的长度
    HDNoip201501计算结果最小
    抽签
    Ants
  • 原文地址:https://www.cnblogs.com/gcxblogs/p/14979282.html
Copyright © 2020-2023  润新知