美文网首页
SQLAlchemy 版本迁移的使用(十三)

SQLAlchemy 版本迁移的使用(十三)

作者: 梦捷者 | 来源:发表于2020-04-15 08:57 被阅读0次

    一、安装相应的工具和其使用

    1、安装alembic
    pip install alembic

    2、完成 pip 安装alembic之后步骤如下

    • 在 shell 脚本里面 cd 到项目根目录执行
      alembic init alembic
      注意:tree -L 数字----是用来查看文件的结构
    • 用 pycharm 把生成的文件 download 到windows上(包括 alembic 目录和 alembic.ini
    • 修改 alembic.ini 设置数据库连接。
      修改项如下所示:
    sqlalchemy.url = driver://user:pass@localhost/dbname
    sqlalchemy.url = mysql+pymysql://admin:Root110qwe@127.0.0.1:3306/mydb#我本次使用的路径
    
    • env.py 中设置,将target_metadata赋值成数据库的元数据(Base.metadata) ;为了防止出现以下,将考虑以下的问题,如果执行 revision 有 import 报错,注意是否正确将当前项目目录添加到 sys.path 路径
    import sys
    from os.path import abspath,dirname
    
    project_root = dirname(dirname(abspath(__file__)))#把项目根目录加入 sys.path
    print(project_root)
    sys.path.insert(0, project_root)
    from models.auth import Base
    target_metadata = Base.metadata
    
    import sys
    from os.path import abspath,dirname
    root = dirname(dirname(abspath(__file__))) # 把项目根目录加入 sys.path(取出项目的绝对路径)
    root1 = dirname(abspath(__file__)) #取出此文件以上的(不包括此文件)的路径
    root3 =abspath(__file__) # 取出此文件在的绝对路径
    print(root)
    print(root1)
    print(root3)
    
    /home/pyvip/mytornado
    /home/pyvip/mytornado/alembic
    /home/pyvip/mytornado/alembic/test.py
    
    • 配置完成执行
    alembic revision --autogenerate -m "create_user_table" #自动生成迁移脚本
    
    • 这里可以看到虚拟机目录在 alembic/versions 里生成了 py 文件,然后执行
    alembic upgrade head#这样就会更新 mysql 数据库了,创建了相应的表
    

    二、数据库在项目中的表

    1、user表

    class User(Base):
    
        __tablename__ = 'user'
        id = Column(Integer, primary_key=True, autoincrement=True)
        username = Column(String(50), nullable=False)
        password = Column(String(50))
        creatime = Column(DateTime, default=datetime.now)
    

    2、posts表(上传图片的模型,针对图片的)

    from sqlalchemy import (Column, String, Integer, DateTime, ForeignKey)
    
    class Post(Base):
        __tablename__ = 'posts'
    
        id = Column(Integer, primary_key=True, autoincrement=True)
        image_url = Column(String(200))
    
        user_id = Column(Integer, ForeignKey('user.id'))
        user = relationship('User', backref='posts', uselist=False, cascade='all')
    
        def __repr__(self):
            return "<Post:#{}>".format(self.id)
    

    三、alembic相应命令的使用

    1、查看记录和历史
    alembic history

    2、回退上一个升级的版本
    alembic downgrade -1

    3、查看生成的 py 文件
    ls -l alembic/versions

    4、删除
    rm alembic/versions/xxx.py

    四、常见问题

    1、执行 alembic 报错,KeyError:'5b29018b55ba'
    原因:该版本曾经upgrade执行过了,但是文件被删除。
    解决办法:更新数据库 alembic_version 表记录。
    ERROR [alembic.util.messaging] Can't locate revision identified by 'a2de455a4f51' FAILED: Can't locate revision identified by 'a2de455a4f51'
    2、执行 alembic revision --autogenerate 没有看到生成的 py 文件有数据库更新操作的代码
    原因:Base import 不正确,或者 model 定义不正确。
    解决办法:检查 model 代码。
    3、数据库还没有执行 upgrade head 更新,不能执行 autogenerate,ERROR [alembic.util.messaging] Target database is not up to date. FAILED: Target database is not up to date.
    删除 versions 所有 py 文件之后的重新开始,最好把数据库的表也删除完,这样才能确保生成的py文件反应所有数据库变更。
    4、单独更改列名或一些列属性和表名等不能自动识别(需要注意)

    相关文章

      网友评论

          本文标题:SQLAlchemy 版本迁移的使用(十三)

          本文链接:https://www.haomeiwen.com/subject/opiouctx.html