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
カスタムジェネレータをつくる。
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()
スキーマファイルにカスタムジェネレータの設定を追記する。
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)