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文件

在这里插入图片描述

5.修改alembic配置文件

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

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

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

在这里插入图片描述

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版本号

2.sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (1170, “BLOB/TEXT column ‘c_advice’ used in key specification without a key length”)的解决办法

 email_send_person= Column(LONGTEXT(),index=True,  comment="收件人")

(1) 把index=True去掉

 email_send_person= Column(LONGTEXT(),comment="收件人")

(2)尝试使用VARCHAR并设置长度

 email_send_person= Column(VARCHAR(10000),index=True,comment="收件人")

四.迁移小工具

创建一个bat文件,就不用每次敲命令行了
migrate.bat

alembic revision && alembic upgrade head

migrate.sh

alembic revision && alembic upgrade head

五.动态修改alembic.ini配置文件

  from configparser import ConfigParser
    # 创建ConfigParser对象
  config_parser = ConfigParser()
   # 读取alembic.ini文件中的配置
  config_parser.read('alembic.ini')
  config_parser.set('alembic', 'sqlalchemy.url', 'mysql+pymysql://root:123456@127.0.0.1/test?charset=utf8mb4')
  with open('alembic.ini', 'w') as f:
       config_parser.write(f)
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bruce-li__

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值