alembic迁移

alembic 作用

alembic是sqlalchemy的作者开发的。用来做OMR模型与数据库的迁移与映射。alembic使用方式跟git有点了类似,表现在两个方面。

第一个,alembic的所有命令都是以alembic开头
第二,alembic的迁移文件也是通过版本进行控制的。首先,通过pip install alembic进行安装。

以下将解释alembic的用法
方便数据库与ORM模型的迁移与映射

一.项目开始前就应用

1.alembic 安装

pip install alembic==1.10.4
pip install pymysql==1.0.3

2.alembic用法

先创建好ORM模型
这里默认的sqlalchemy2.0版本

from sqlalchemy import create_engine, Column, String, Integer
from sqlalchemy.orm import DeclarativeBase

DIALCT = "mysql"
DRIVER = "pymysql"
USERNAME = "root"
PASSWORD = "123456"
HOST = "127.0.0.1"
PORT = "3306"
DATABASE = "alembic_demo"

DB_URI = "{}+{}://{}:{}@{}:{}/{}?charset=utf8".format(DIALCT, DRIVER, USERNAME, PASSWORD, HOST, PORT, DATABASE)
"""
sqlalchemy2.0版本
"""

engine = create_engine(DB_URI)

class Base(DeclarativeBase):
    pass


class User(Base):
    __tablename__ = "user"
    id = Column(Integer, primary_key=True, autoincrement=True)
    name = Column(String(50), nullable=False)



3.进入虚拟环境

4.初始化alembic仓库

alembic init alembic
#注:第一个alembic是alembic语法,
#类似git。第二个init代表初始化,
#第三个alembic代表仓库名,你也可以命名其它名字,
#这里为了方便理解,所以采用了alembic这一名字
我们就可以看到我们的项目下多了一个alembic文件和alembic.ini文件

alembic迁移_第1张图片

5.修改alembic配置文件

sqlalchemy.url = mysql+pymysql://root:123456@localhost/alembic_demo

#注:和数据库连接信息一样

6.修改env.py文件的target_metadata参数

alembic迁移_第2张图片

import os
import sys
import alembic_demo
 
# 把当前项目路径加入到path中
sys.path.append(os.path.dirname(os.path.dirname(__file__)))
 
target_metadata = alembic_demo.Base.metadata

7.迁移

创建数据库迁移文件

alembic revision --autogenerate -m "first commit"
#创建成功会在version目录下创建一个迁移文件
#前面xxx...ad这段代表迁移版本号,后面first_commit代表迁移信息

在这里插入图片描述

将迁移文件映射到数据库中

alembic upgrade head

出现下方信息,说明成功映射到表中
在这里插入图片描述在这里插入图片描述

注:alembic映射到数据库流程,ORM模型 ——迁移文件——映射到数据库中

7.1 这里是针对使用sqlalchemy1.4的

报错:TypeError: declarative_base() takes 0 positional arguments but 1 was given

pip install sqlalchemy==1.4.48
from sqlalchemy import create_engine,Column,String,Integer
from sqlalchemy.ext.declarative import declarative_base
 
DIALCT = "mysql"
DRIVER = "pymysql"
USERNAME = "root"
PASSWORD = "123456"
HOST = "127.0.0.1"
PORT = "3306"
DATABASE = "alembic_demo"
 
DB_URI = "{}+{}://{}:{}@{}:{}/{}?charset=utf8".format(DIALCT,DRIVER,USERNAME,PASSWORD,HOST,PORT,DATABASE)
"""
sqlalchemy1.4版本
"""
engine = create_engine(DB_URI)
Base = declarative_base(engine)
 
class User(Base):
    __tablename__ = "user"
    id = Column(Integer , primary_key=True , autoincrement=True)
    name = Column(String(50) , nullable=False)
 
 

8. 重复

如果以后修改了代码,则重复 7 的步骤。

9.常用命令和参数

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

另外,在你第一次执行upgrade的时候,就会在数据库中创建一个名叫alembic_version表,这个表只会有一条数据,记录当前数据库映射的是哪个版本的迁移文件。

- 更新数据库 	`alembic upgrade 版本号`
- 更新到最新版 	`alembic upgrade head`
- 降级数据库 	`alembic downgrade 版本号` 
- 更新到最初版 	`alembic downgrade head`
alembic upgrade 版本号 --sql > migration.sql####离线更新(生成sql) 

二.项目开发到一半用alembic库

1.数据库字段类型和代码字段类型不一致

2.表中有数据了改代码,数据会不会丢失

待更新…

三.常见问题

1.因某些原因误删除了alembic迁移文件,导致数据库版本号(alembic_version)跟迁移文件版本号不一致所致在这里插入图片描述

解决方法:打开mysql删除alembic_version版本号

你可能感兴趣的:(git,数据库,python)