likes
comments
collection
share

Prisma 与 SQLAchemly pgAdmin4 数据迁移经验分享开始之前 之前有一个项目从 Remix + P

作者站长头像
站长
· 阅读数 22

开始之前

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 initalembic init alembic
生成迁移文件prisma migrate dev --name <migration_name>alembic revision --autogenerate -m "<message>"
应用迁移prisma migrate deployalembic upgrade head
回滚迁移prisma migrate resetalembic downgrade <revision_id>
检查数据库差异prisma db pull自动生成时无需额外命令 (通过模型)
运行迁移状态检查prisma migrate statusalembic current
手动编辑迁移文件通过 prisma 生成后编辑文件直接编辑 alembic/versions/*.py
更新模型 (从数据库同步)prisma db pull与 SQLAlchemy 模型同步 (无命令直接支持)
查看迁移历史prisma migrate statusalembic history
切换到特定迁移版本不直接支持,需手动处理alembic upgrade <revision_id>
回滚到初始状态prisma migrate resetalembic downgrade base

不同的生态虽然命令行不一样,但是对应的命令是一样的。

推荐的备份方式

因为我们数据库值已经存在了,迁移到 python 之后,最好是在 alembic head 生数据库表之前就将数据恢复。如果不是这样的,在恢复数据的时候非常容易报错。

这里我们备份的时候,可以选择 sql 和 backup 两种文件,如果需要自己查看 sql 内容,推荐使用 sql, 如果不需要推荐 backup 文件。

Prisma 与 SQLAchemly pgAdmin4 数据迁移经验分享开始之前 之前有一个项目从 Remix + P

在 pgAdmin4 中备份非常简单。选择一个 backup 的文件文件名和文件指定文件位置即可。

  • 字符编码
  • role_name

Prisma 与 SQLAchemly pgAdmin4 数据迁移经验分享开始之前 之前有一个项目从 Remix + P

聊聊配置 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
评论
请登录