0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Prisma スキーマの構造を Python からいじって遊ぶ

Last updated at Posted at 2024-09-12

Prisma のスキーマファイルの構造をコネコネいじって遊びたいときってありますね? ない? そう...

Prisma スキーマを parse した AST の構造は DMMF (Data Model Meta Format)1 というらしく、TypeScript Client なんかだとかなり簡単に取得することができるらしい。

ただデータをコネコネいじって遊びたいときは Python のほうがやりやすい (主観) ので、Python で遊ぶ用に取得できないかと思って試していたらできたので、まとめておく。

DMMF を Pickle として dump する

別に DMMF を JSON に dump してもいいんだけど、Prisma Client Python 2 が提供する Pydantic の型にハメたほうが扱いやすい。

直接的に DMMF を取得する getDMMF みたいな便利関数は Prisma Client Python ではサポートされていないようなので、構造を Pickle として dump するカスタムジェネレータを作ってみる。

まずは Prisma Client Python を入れる。

$ pip install prisma

カスタムジェネレータをつくる。

dmmf_pickle_dumper.py
import pickle

from prisma.generator import BaseGenerator, DefaultData, Manifest


class DmmfPickleDumper(BaseGenerator):
    def get_manifest(self) -> Manifest:
        return Manifest(
            name="DMMF Pickle Dumper",
            default_output="dmmf.pickle",
        )

    def generate(self, data: DefaultData) -> None:
        with open(data.generator.output.value, "wb") as f:
            pickle.dump(data.dmmf, f)


if __name__ == "__main__":
    DmmfPickleDumper.invoke()

スキーマファイルにカスタムジェネレータの設定を追記する。

prisma.schema
generator dmmf_pickle {
  provider = "python dmmf_pickle_dumper.py"
}

実行する。

$ prisma generate

すると dmmf.pickle が生成されている。ヤッター!

DMMF で遊ぶ

お好きな Python 環境で Pickle をロードすれば Pydantic な型の DMMF データ構造が得られるので、あとはご自由に!!

import pickle

with open("dmmf.pickle", "rb") as f:
    dmmf = pickle.load(f)
  1. https://github.com/prisma/prisma/blob/main/ARCHITECTURE.md#the-dmmf-or-data-model-meta-format

  2. https://prisma-client-py.readthedocs.io/en/stable/

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?