Prisma 与 SQLAchemly pgAdmin4 数据迁移经验分享开始之前 之前有一个项目从 Remix + P
开始之前
之前有一个项目从 Remix + Prisma 迁移到 FastAPI + SQLAchemly + alembic。事情也是发生在 alembic 迁移工作。
pgAdmin4 是我们主要导入导出工具。先来回顾一下 Prisma 和 alembic 的迁移对比吧
对比
Prisma 需要编写单独的 prisma 模型文件,SQLAchemly 是建立的 Python 代码上的。他们有本质的还是挺大的。在代码迁移的时候需要配置 alembic 到。下面是迁移相关命令行对比:
操作 | Prisma 命令 | Alembic 命令 |
---|---|---|
初始化迁移工具 | prisma migrate dev --name init | alembic init alembic |
生成迁移文件 | prisma migrate dev --name <migration_name> | alembic revision --autogenerate -m "<message>" |
应用迁移 | prisma migrate deploy | alembic upgrade head |
回滚迁移 | prisma migrate reset | alembic downgrade <revision_id> |
检查数据库差异 | prisma db pull | 自动生成时无需额外命令 (通过模型) |
运行迁移状态检查 | prisma migrate status | alembic current |
手动编辑迁移文件 | 通过 prisma 生成后编辑文件 | 直接编辑 alembic/versions/*.py |
更新模型 (从数据库同步) | prisma db pull | 与 SQLAlchemy 模型同步 (无命令直接支持) |
查看迁移历史 | prisma migrate status | alembic history |
切换到特定迁移版本 | 不直接支持,需手动处理 | alembic upgrade <revision_id> |
回滚到初始状态 | prisma migrate reset | alembic downgrade base |
不同的生态虽然命令行不一样,但是对应的命令是一样的。
推荐的备份方式
因为我们数据库值已经存在了,迁移到 python 之后,最好是在 alembic head 生数据库表之前就将数据恢复。如果不是这样的,在恢复数据的时候非常容易报错。
这里我们备份的时候,可以选择 sql 和 backup 两种文件,如果需要自己查看 sql 内容,推荐使用 sql, 如果不需要推荐 backup
文件。
在 pgAdmin4 中备份非常简单。选择一个 backup 的文件文件名和文件指定文件位置即可。
- 字符编码
- role_name
聊聊配置 alembic
alembic 初始化之后,就生成一些配置文件:
alembic+
/version
xxx.py
env.py
README
script.py.mako
alembic.ini
模型
我们需要使用 SQLAchemly 定义基础模型:
from sqlalchemy.orm import sessionmaker, declarative_base
Base = declarative_base()
我们代码中使用所有的模型都是导入的,为了避免手动导入,这里我们使用 __import__
方式进行导入:
from app.db.client import Base
# from app.models.blog import Blog
import glob
model_folder = os.path.join('app', 'models')
settings = get_settings()
model_files = glob.glob(os.path.join(model_folder, '**/*.py'))
for model_file in model_files:
if model_file.endswith('__init__.py') is not True:
__import__(f"{model_file.replace('.py', '').replace(os.sep, '.')}")
else:
__import__(f"{model_file.replace('.py', '').replace(os.sep, '.')[:-9]}")
首先模型文件会存在一个文件夹下面,我们使用 glob 模块获取模型文件名字。然后使用 __import__
导入文件。
数据库地址
alembic 需要访问数据库, alembic 的地址需要直接,但是存在一个问题,开源项目的时候我们不能暴露 url 地址,当然这里推荐使用 pydantic-settings 直接获取 env 文件的方式。
config.set_main_option('sqlalchemy.url', settings.DATABASE_URL_SYNC)
在 alembic 配置文件 env.py
中添加以上语句,访问数据库地址即可。这里我们 DATABASE_URL_SYNC 原因是,我们使用异步,异步的数据库访问与同步 url 地址不一样。在数据库迁移中 alembic 使用同步即可。
小结
本文对比了 Prisma 和 SQLAchemly + alembic 数据迁移的用法,在 pgAdmin4 使用 backup 方式进行备份数据为佳。如果需要查看 sql 可以另外导出。其次就是 alembic 中配置 url 以及模型导入处理方式。
转载自:https://juejin.cn/post/7423311917505249295