饮冰十年-人工智能-FastAPI-03- FastAPI之模型迁移(类似Django的migrante)
在开发 Web 应用程序时,通常会涉及到数据库模型的更改,例如添加新的表、字段或索引。为了使这些更改反映在数据库中,我们使用数据库迁移工具。FastAPI 本身并不包含数据库迁移(migration)的功能,但你可以使用第三方库来处理数据库迁移。其中,Alembic
是一个常用的数据库迁移工具,可以与 FastAPI 一起使用。本文我将向你介绍如何结合 FastAPI 和 Alembic 进行 SQLite 数据库迁移的步骤,
一、安装 Alembic 和配置
步骤 1:安装 FastAPI 和 Alembic
pip install fastapi[all] alembic
这将安装 FastAPI 和 Alembic 及其相关依赖项。
pip install alembic
步骤 2:创建 FastAPI 项目
todo:参考上一篇博客
3、创建数据库模型
在 FastAPI 项目中,我们首先定义数据库模型。在 main.py
文件中创建一个简单的用户模型:
from sqlalchemy import Column, Integer, String from sqlalchemy.ext.declarative import declarative_base Base = declarative_base() class User(Base): __tablename__ = "users" id = Column(Integer, primary_key=True, index=True) username = Column(String, index=True) email = Column(String, unique=True, index=True)
4:初始化 Alembic
运行以下命令初始化 Alembic 配置:
alembic init alembic
这将在项目中创建一个名为 alembic
的文件夹,并生成一些默认的配置文件。
步骤 5:配置 Alembic
打开 alembic.ini
文件,将数据库连接信息配置为你的实际数据库连接。找到以下部分:
# sqlalchemy.url = driver://user:pass@localhost/dbname
sqlalchemy.url = sqlite:///database.db
将其更新为你的数据库连接信息。
步骤 6:生成迁移脚本
运行以下命令,使用 Alembic 自动生成数据库迁移脚本:
alembic revision -m "first migrations"
Alembic 将分析你的 SQLAlchemy 模型,并生成一个包含必要指令的迁移脚本,以将数据库模式调整为与你的模型定义相对应的状态
步骤 7:执行数据库迁移
运行以下命令,将生成的迁移脚本应用到数据库:
alembic upgrade head
这将在数据库中创建相应的数据库。
二、进行模型创建与迁移
1:修改env.py文件
from main import User target_metadata = User.metadata
这里暂时把model放置在了main.py,仅作为演示
2:生成迁移脚本
alembic revision --autogenerate -m "initial migrations"
3:执行数据库迁移
alembic upgrade head
三、进行模型调整与创建
1:修改模型文件
在此基础上添加一个新模型,对旧模型添加一个字段,删除一个字段
# This is a sample Python script. # Press Shift+F10 to execute it or replace it with your code. # Press Double Shift to search everywhere for classes, files, tool windows, actions, and settings. from sqlalchemy import Column, Integer, String from sqlalchemy.ext.declarative import declarative_base Base = declarative_base() class User(Base): __tablename__ = "users" id = Column(Integer, primary_key=True, index=True) username = Column(String, index=True) # email = Column(String, unique=True, index=True) age = Column(Integer, index=True) class School(Base): __tablename__ = "school" name = Column(String, index=True)
2:修改env.py文件
from main import User, School
target_metadata = School.metadata
target_metadata = User.metadata
3:生成迁移脚本
alembic revision --autogenerate -m "second migrations modify user,add school "
4:执行数据库迁移
alembic upgrade head