こんにちは、鈴木商店の佐野です。
最近 Prisma というORMを触る機会があり素晴らしいなぁと色々調べていたらPrismaをPythonで使うことを目的とした Prisma Client Python というプロジェクトを発見したので試してみました。(本家PismaはTypeScriptのORM)
私は普段の実装のほとんどがPythonなので、PythonでPrismaの開発体験が得られると考えると非常に嬉しいです。
ブログに書きたくなるほど嬉しいです。
PrismaはDBと直接やりとりするエンジン部分はRustで実装されています。アプリケーションは Prisma Client を使って、そのエンジン部分とやりとりすることでDBを操作しています。今回試す Prisma Client Python は Python用 の Prisma Client という位置付けのようで、NodeやTypescriptがいらないのでお手軽に使えます。
またエンジン部分は同じなので言語的な表現の違いはあれど大体同じ機能が揃っていくはずです。
気になる実際のコードですが、
スキーマの定義やマイグレーションなど本家と同じです。
schema.prisma
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
generator client { provider = "prisma-client-py" } datasource db { provider = "postgresql" url = env("DATABASE_URL") } model User { id Int @id @default(autoincrement()) email String @unique name String? posts Post[] } model Post { id Int @id @default(autoincrement()) title String content String? views Int @default(0) published Boolean @default(false) author User? @relation(fields: [author_id], references: [id]) author_id Int? } |
もちろんコマンドなども大体同じです。
1 2 3 4 5 6 7 8 9 |
# Client生成 $ prisma generate # マイグレーション $ prisma migrate dev # DB反映 $ prisma db push |
Pythonからの使用感はというと、、、
Python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
user = await prisma.user.create( data={ 'name': 'sample', 'email': 'sample@example.com', 'posts': { 'create': { 'title': 'Include this post!', 'content': 'prisma', }, }, }, include={ 'posts': True, } ) |
TypeScript
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
const user = await prisma.user.create({ data: { name: 'sample', email: 'sample@example.com', posts: { create: { title: 'Include this post!', content: 'prisma', }, }, }, include: { posts: true, } }) |
言語的な違いで若干Pythonの方がもっさり気味(dictのkeyが文字列だから?)ですが、TypeScript と同じく良い感じです。CRUDに関しては本家とほとんど変わらない印象です。
実運用で使えるかは未知数ですが軽く使った感じはかなり期待できます。まだまだ新しいプロジェクトなので不足している部分があるようですが、今後の発展を注視していければと思います。
今回試したコードはこちらにpushしました。
https://github.com/sssano/Try-Prisma-Client-Python