饮冰十年-人工智能-FastAPI-03- FastAPI之模型迁移(类似Django的migrante)

发布时间 2023-12-09 14:52:44作者: 逍遥小天狼

         在开发 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