TypeScriptで使えるPrismaと言う名のORM(Object Relational Mapping)

f:id:ts0818:20220101202513j:plain

nazology.net

中国吉林大学の研究チームは、通称バッキーボールと呼ばれるサッカーボールのような構造の炭素分子に高い圧力と温度をくわえて崩壊させ、ダイヤモンドよりも硬いカーボンガラスの作成に成功しました。

ダイヤモンドより硬い「超硬ガラス」が開発される - ナゾロジー

これは最近報告された「AM-Ⅲ」というカーボンガラスに次いで、世界で2番目に硬いガラスです。

ダイヤモンドより硬い「超硬ガラス」が開発される - ナゾロジー

⇧ 「硬度10ダイヤモンドパワー!(悪魔将軍『キン肉マン』)」を超える硬度が実現されていたとは...

ちなみに、

gstvfan.jp

宝石の硬さを示す硬度は「モース」硬度「ヌープ硬度」の2種類が主に使われています。その中でもより一般的に使われているのは「モース硬度」 という尺度です。

宝石の硬度について〜モース硬度10~1まで〜 - GSTV FAN

⇧ 宝石は「モース」硬度ってものが使われることが多いそうな。

今回も、「TypeScript」についてです。

レッツトライ~。

Prismaと言う名のORM(Object Relational Mapping)

公式のドキュメントによりますと、

www.prisma.io

Prisma is an open source next-generation ORM. It consists of the following parts:

  • Prisma Client: Auto-generated and type-safe query builder for Node.js & TypeScript
  • Prisma Migrate: Migration system
  • Prisma Studio: GUI to view and edit data in your database

https://www.prisma.io/docs/concepts/overview/what-is-prisma

⇧ ということで、「次世代のORM」という謳い文句を掲げていらっしゃるのですが、これまでの「TypeScript」の「ORM」を使ったことも無いので、何が違うかが分からんというね...

Prismaを試してみる

とりあえず、公式のドキュメントによりますと、

github.com

Getting Started

The Quickstart is based on a preconfigured SQLite database. You can also get started with your own database (PostgreSQL and MySQL) by following one of these guides:

https://github.com/prisma/prisma

⇧ ということで、どっちかで導入していく感じですかね。

自分の環境では、

ts0818.hatenablog.com

⇧ 上記記事で既に「TypeScript」のプロジェクトを作成しているので、「Add Prisma to an existing project」の場合で、試してみます。

f:id:ts0818:20220101085431p:plain

f:id:ts0818:20220101085623p:plain

f:id:ts0818:20220101085825p:plain

f:id:ts0818:20220101085952p:plain

f:id:ts0818:20220101090138p:plain

で、「PostgreSQL」の場合の「データベース」の接続設定は、

www.prisma.io

⇧ 上記によりますと、「.env」ファイルの「DATABASE_URL」の値を自分の利用してるデータベースに対する接続設定にすればOKらしい。

■データベースの作成
とりあえず、prisma用にデータベースを作成することにします。

f:id:ts0818:20220101092909p:plain

■データベースの接続設定

.envファイルの「DATABASE_URL」の値で設定していく感じのようです。

DATABASE_URL="postgresql://USER:PASSWORD@HOST:PORT/DATABASE?schema=SCHEMA"

自分の場合は、以下のような感じになりました。

f:id:ts0818:20220101094618p:plain

■テーブルの作成

テーブルの作成についても、

www.prisma.io

SQL文で作成しておく必要があるようです。

作成しておきます。

f:id:ts0818:20220101095312p:plain

■schema.prismaの更新

データベースの「schema」と「schema.prisma」の内容を同期させる必要があるようです。

f:id:ts0818:20220101095519p:plain

 

■@prisma/clientのインストールと「prisma.schema」ファイルの同期

prisma.schema」ファイル側で変更した内容を、「@prisma/client」に反映させるには、「@prisma/client」パッケージをインストールしておく必要があるようです。

「@prisma/client」は実際に、「TypeScript」側で「Prisma」を利用するのに必要ということの模様。

⇧ というイメージ図なんですが、データベースに何か変更があった場合、

  • データベースの「schema」の変更
  • prisma.schema」ファイルの更新
  • @prisma/clientへ反映

という流れになるみたい。

というわけで、「@prisma/client」をインストール。

f:id:ts0818:20220101102359p:plain

「node_modules」の「@prisma」に「client」が追加されてます。

f:id:ts0818:20220101102511p:plain

f:id:ts0818:20220101111057p:plain

とりあえず、試してみる。

import { PrismaClient } from "@prisma/client";

const prisma = new PrismaClient();

async function main() {
  await prisma.user.create({
    data: {
      name: "Alice",
      email: "alice@prisma.io",
      Post: {
        create: { title: "Hello World" },
      },
      Profile: {
        create: { bio: "I like turtles" },
      },
    },
  });

  const allUsers = await prisma.user.findMany({
    include: {
      Post: true,
      Profile: true,
    },
  });
  console.dir(allUsers, { depth: null });
}

main()
  .catch((e) => {
    throw e;
  })
  .finally(async () => {
    await prisma.$disconnect();
  });

f:id:ts0818:20220101113018p:plain

f:id:ts0818:20220101113311p:plain

f:id:ts0818:20220101123631j:plain

f:id:ts0818:20220101123759j:plain

f:id:ts0818:20220101123935j:plain

⇧ 各テーブルに登録もされてるようです。

う~ん、

www.prisma.io

⇧ 用意されてるメソッドを利用していく感じとは思うんだけど、

tech.hicustomer.jp

  • Prismaスキーマを記述するDSLに制限があってさらにつらいですね。しかもコア部分がRustで書かれていて、Escape hatcheが用意されていないです。Prismaの思想は、「provide an abstraction layer that makes you more productive compared to writing SQL」なのでこの辺は今後も期待できなさそうですね。

https://tech.hicustomer.jp/posts/type-safe-sql-library-for-nodejs/

⇧ 上記サイト様によりますと、かなり制限がある模様...

「TypeScript」でデータベースを扱うよりは、「Java」「C#」「PHP」「Python」などのようなサーバーサイド言語側でデータベースを扱ったほうが良いのかな?

毎度モヤモヤ感が半端ない...

今回はこのへんで。