一般采用的框架是使用FastAPI+sqlalchemy来进行数据库部分的操作,其中主要是分为以下几步:
- 使用脚本来进行建表(推荐)/直接在fastapi启动时进行建表(小项目)
为什么不采用fastapi的create_all方法来进行建表:
- 如果是大项目有多个表多个实例,每个实例服务都去遍历一遍表导致速度缓慢
-
会导致职责混淆,数据库建表按道理来说是运维部分的工作,fastapi启动服务是指可以使用整个服务了,所以无需再fastapi实例启动时建表
-
如果大项目有多个实例服务,如果同时启动fastapi时使用create_all方法会出现对数据库进行锁的竞争导致卡死
-
fastapi的create_all方法只是会判断有没有表再进行判断,不会更新表的信息,如果添加/删除字段了更新表会出现ORM与数据库不对应的情况,并且在运行时没有报错,在运行时才会报错
-
fastapi启动时建表会导致数据库的版本无法管理,没办法进行回退
-
采用fastapi建表没办法使用CI/CD(自动化集成/自动化部署)的整体流程,
CI:
├─ lint # 代码检查,一般采用ruff
├─ test # 自动化测试
├─ migrate # 数据库迁移
└─ build image # 打包成镜像CD:
├─ deploy # 部署
└─ start app # 启动服务
-
- 数据库的配置,可以采用同步/异步的方式去进行实现,异步的话在同时操作数据库时就需要添加相关的锁/采用事务的方式防止出现同时操作一批数据导致出现脏数据
- 定义数据库的model,即ORM部分,要求ORM部分是与数据库进行对接的