已经使用 Go 开发好一段时间了,最近因为工作原因又重操旧业搞起了 Python,基于 FastAPI 进行接口开发,然后去找了一下相关的脚手架,发现这其中挺多都用到了 Alembic,之前没使用过,于是学习了一下,现学现用,其中也遇到了一点坑,在这里做一下笔记分享。
PS:最近发现的一款云数据库MemfireDB,目前是免费使用的,这个是MemefireDB官网,大家也可以去薅一下羊毛。我觉得自己平时捣腾一下小的项目使用云数据库还是不错的选择,省去了自己在本地或者服务器上去搭建数据库的时间,而且目前总体看来还是比较稳定的,MemFireDB 兼容 Postgres 接口,所以可以直接把 MemFireDB 当作 Postgres 数据库进行使用,使用方法也很简单,有兴趣可以了解使用一下,另外他们还有适合前端开发人员使用的 Baas 平台,我准备尝试试用一下,虽然我只是略懂前端😂,如果后续我觉得好用的话,再跟大家分享一下。
一、项目结构
二、Alembic 的使用
1、安装 alembic (python3.8环境)
pip install alembic
2、生成 alembic 文件
在定义好自己的模型类(models/users.py Users)之后 ,在项目根目录下执行alembic init alembic(自己定义alembic生成的文件夹名称),会自动生成 alembic 文件夹以及 alembic.ini 文件。
3、修改文件配置
1)修改 alembic.ini 文件,新增如下两行
MemfireDB 的连接信息获取方式如下:
【备注】图中 alembic_version 和 users 表是后面执行了相关迁移命令后生成的
2)修改 env.py
3)上一步中导入的 Base,我的我在这里也将代码贴出来一下以供参考
# db/base.pyfrom db.base_class import Base # 导入创建的base类
from models.users import Users #导入创建的模型类
#db/base_class.pyfrom typing import Anyfrom sqlalchemy.ext.declarative import as_declarative, declared_attr@as_declarative()
class Base:id: Any__name__: str# Generate __tablename__ automatically@declared_attrdef __tablename__(cls) -> str:return cls.__name__.lower()
4、执行指令,生成迁移的版本文件,以及对应的数据库表
(bidAnalysisEnv) ➜ bid-analysis alembic revision --autogenerate -m "init"
INFO [alembic.runtime.migration] Context impl PostgresqlImpl.
INFO [alembic.runtime.migration] Will assume transactional DDL.
INFO [alembic.autogenerate.compare] Detected added table 'users'
INFO [alembic.autogenerate.compare] Detected added index 'ix_users_id' on '['id']'Generating /Users/zhangyanli/fastapiProjects/bid-analysis/alembic/versions/3fed3fb70404_init.py ... done
(bidAnalysisEnv) ➜ bid-analysis alembic upgrade head
INFO [alembic.runtime.migration] Context impl PostgresqlImpl.
INFO [alembic.runtime.migration] Will assume transactional DDL.
INFO [alembic.runtime.migration] Running upgrade -> 3fed3fb70404, init
此时再去看数据库中,就会生成对应的 users 表了。如果模型字段有变动,再重复执行上述指令。
三、对于 MemfireDB的使用
【附:alembic 相关指令】
init
:创建一个alembic仓库。revision
:创建一个新的版本文件。–autogenerate
:自动将当前模型的修改,生成迁移脚本。-m
:本次迁移做了哪些修改,用户可以指定这个参数,方便回顾。upgrade
:将指定版本的迁移文件映射到数据库中,会执行版本文件中的upgrade函数。如果有多个迁移脚本没有被映射到数据库中,那么会执行多个迁移脚本。[head]
:代表最新的迁移脚本的版本号revision。downgrade
:会执行指定版本的迁移文件中的downgrade函数。heads
:展示head指向的脚本文件版本号。history
:列出所有的迁移版本及其信息。current
:展示当前数据库中的版本号。
另外,在你第一次执行upgrade
的时候,就会在数据库中创建一个名叫alembic_version
表,这个表只会有一条数据,记录当前数据库映射的是哪个版本的迁移文件。