alembic

alembicsqlalchemy的作者开发的。用来做ORM模型与数据库的迁移与映射。alembic使用方式跟git有点了类似,表现在两个方面,第一个,alembic的所有命令都是以alembic开头;第二,alembic的迁移文件也是通过版本进行控制的。首先,通过pip install alembic进行安装。

使用alembic的步骤:
1. 定义好自己的模型。
2. 使用alembic创建一个仓库:`alembic init [仓库的名字,推荐使用alembic]`。
3. 修改配置文件:
    * 在`alembic.ini`中,给`sqlalchemy.url`设置数据库的连接方式。这个连接方式跟sqlalchemy的方式一样的。
    * 在`alembic/env.py`中的`target_metadata`设置模型的`Base.metadata`。但是要导入`models`,需要将models所在的路径添加到这个文件中。示例代码如下:
        ```python
        import sys,os
        sys.path.append(os.path.dirname(os.path.dirname(__file__)))
        ```
4. 将ORM模型生成迁移脚本:`alembic revision --autogenerate -m 'message'`。
5. 将生成的脚本映射到数据库中:`alembic upgrade head`。
6. 以后如果修改了模型,重复4、5步骤。
7. 注意事项:在终端中,如果想要使用alembic,则需要首先进入到安装了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:展示当前数据库中的版本号。

### 经典错误:
1. FAILED: Target database is not up to date.
    * 原因:主要是head和current不相同。current落后于heads的版本。
    * 解决办法:将current移动到head上。alembic upgrade head
2. FAILED: Can't locate revision identified by '77525ee61b5b'
    * 原因:数据库中存的版本号不在迁移脚本文件中
    * 解决办法:删除数据库的alembic_version表中的数据,重新执行alembic upgrade head
3. 执行`upgrade head`时报某个表已经存在的错误:
    * 原因:执行这个命令的时候,会执行所有的迁移脚本,因为数据库中已经存在了这个表。然后迁移脚本中又包含了创建表的代码。

    * 解决办法:(1)删除versions中所有的迁移文件。(2)修改迁移脚本中创建表的代码。

# flask_migrate
在实际的开发环境中,经常会发生数据库修改的行为。一般我们修改数据库不会直接手动的去修改,而是去修改ORM对应的模型,然后再把模型映射到数据库中。这时候如果有一个工具能专门做这种事情,就显得非常有用了,而flask-migrate就是做这个事情的。flask-migrate是基于Alembic进行的一个封装,并集成到Flask中,而所有的迁移操作其实都是Alembic做的,他能跟踪模型的变化,并将变化映射到数据库中。

### 安装:
pip install flask-migrate

### 在manage.py中的代码:
```python
from flask_script import Manager
from 主app.py import app
from exts import db
from flask_migrate import Migrate,MigrateCommand

manager = Manager(app)

# 用来绑定app和db到flask_migrate的

Migrate(app,db)


# 添加Migrate的所有子命令到db下
manager.add_command("db",MigrateCommand)

if __name__ == '__main__':
    manager.run()

```


### flask_migrate常用命令:
1. 初始化一个环境:python manage.py db init
2. 自动检测模型,生成迁移脚本:python manage.py db migrate
3. 将迁移脚本映射到数据库中:python manage.py db upgrade
4. 更多命令:python manage.py db --help
### Alembic 报错解决方案 当使用 Alembic 工具时,如果遇到无法正确链接到应用程序的问题,通常是因为路径配置不正确或者环境变量未设置妥当。以下是针对该问题的具体分析和解决方法。 #### 1. 路径配置错误 Alembic 的 `env.py` 文件需要导入项目中的模型定义文件(通常是 SQLAlchemy ORM 定义)。如果项目的结构复杂,可能会导致相对路径或绝对路径的解析失败。可以通过以下方式解决问题: - **检查路径**: 确保 `env.py` 中的 `from myapp.models import Base` 使用的是正确的模块名称和路径[^1]。 - **修改 sys.path**: 如果应用位于不同的目录下,可以动态调整 Python 的模块搜索路径: ```python import sys from os.path import abspath, dirname # 将应用根目录加入sys.path sys.path.insert(0, abspath(dirname(__file__) + '/../myapp')) from models import Base # 假设models.py在myapp包中 ``` #### 2. 数据库连接字符串错误 如果数据库连接字符串配置有误,也会引发运行时异常。确保 SQL Alchemy URL 配置无误,其标准格式为: ``` dialect+driver://username:password@host:port/database ``` 例如: ```python SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:password@localhost/mydatabase' ``` 此部分可参考提供的说明[^2]。 #### 3. Celery 后端配置冲突 某些情况下,Celery 和 Alembic 可能共享相同的后端存储服务(如 Redis 或 MySQL),这可能导致资源竞争或其他意外行为。建议单独配置 Celery 结果后端以避免干扰[^3]: ```python CELERY_RESULT_BACKEND = 'db+mysql://airflow_user:airflow_password@localhost:3306/celery_results' ``` #### 4. 运行命令上下文缺失 有时,在执行 Alembic 命令前需初始化特定的应用程序上下文。比如 Flask 应用可能需要手动创建 app 实例并激活上下文: ```python from flask import Flask from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///test.db' # 替换为目标DB URI db = SQLAlchemy(app) with app.app_context(): # 执行alembic操作 pass ``` 通过以上措施能够有效定位并修复大多数常见的 Alembic 错误场景。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值