🐷

node.js / Prisma ORM / mysql を試す例

2021/04/04に公開

概要:

前の Prisma 初級編の続編となり。mysql操作するメモとなります

  • Getting started を例を試しました。

環境

  • node 14
  • prisma: 2.20.0
  • mysql: 5.7.33

参考

https://www.prisma.io/docs/getting-started/setup-prisma/start-from-scratch-node-mysql


■ 試した内容

  • 上記のgetting-started、従って進めました
mkdir hello-prisma
cd hello-prisma

  • npm 追加など、prisma初期化
npm init -y
npm install prisma --save-dev
npm install @prisma/client
npx prisma init
  • prisma/schema.prisma
datasource db {
  provider = "mysql"
  url      = env("DATABASE_URL")
}
  • DATABASE_URL, .envに設定

mysql://ユーザー名:パワード@localhost:3306/DB名

( DB作成権限が無いと。エラーになりましたので。権限の追加や, rootで接続すると実行できました )

DATABASE_URL = 'mysql://johndoe:randompassword@localhost:3306/mydb'

  • schema 定義

    db接続含むファイルは。下記

https://gist.github.com/kuc-arc-f/8ce490b04f5a3f669d9bd59978ee8375

model Post {
  id        Int      @default(autoincrement()) @id
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt
  title     String   @db.VarChar(255)
  content   String?
  published Boolean  @default(false)
  author    User     @relation(fields: [authorId], references: [id])
  authorId  Int
}

model Profile {
  id     Int     @default(autoincrement()) @id
  bio    String?
  user   User    @relation(fields: [userId], references: [id])
  userId Int     @unique
}

model User {
  id      Int      @default(autoincrement()) @id
  email   String   @unique
  name    String?
  posts   Post[]
  profile Profile?
}

  • migrate実行
npx prisma migrate dev --name init

動作の確認

  • insert, find
index.js
const { PrismaClient } = require('@prisma/client')

const prisma = new PrismaClient()

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

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

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

  • 結果、 node index.jsで実行
> node index.js

[ { id: 1,
    email: 'alice@prisma.io',
    name: 'Alice',
    posts:
     [ { id: 1,
         createdAt: 2021-04-03T10:16:36.688Z,
         updatedAt: 2021-04-03T10:16:36.688Z,
         title: 'Hello World',
         content: null,
         published: false,
         authorId: 1 } ],
    profile: { id: 1, bio: 'I like turtles', userId: 1 } }
]

  • update
index.js
async function main() {
  const post = await prisma.post.update({
    where: { id: 1 },
    data: { published: true },
  })
  console.log(post)
}

  • 実行すると、更新できました
> node index.js
{ id: 1,
  createdAt: 2021-04-03T10:16:36.688Z,
  updatedAt: 2021-04-03T23:56:19.440Z,
  title: 'Hello World',
  content: null,
  published: true,
  authorId: 1 }


  • 参考のpackage.json
{
  "name": "prisma-mysql",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "prisma": "^2.20.1"
  },
  "dependencies": {
    "@prisma/client": "^2.20.1"
  }
}

追記

  • Next.js サンプルが公開されていたので。試してみました

sqlite版でしたが、上記の mysql設定(schema.prisma等) で利用可能でした

  • seed から、テストデータも読込可能で。便利でした

https://github.com/prisma/prisma-examples/tree/latest/javascript/rest-nextjs


*追記 : 2021/04/06
TEXT 型の追加は、String? @db.Text 、で可能でした

textCol String? @db.Text

https://www.prisma.io/docs/reference/api-reference/prisma-schema-reference


  • 追記 : 2021/04/07

  • find /IN の実行

https://www.prisma.io/docs/reference/api-reference/prisma-client-reference#in

  const posts = await prisma.temp1.findMany({
    where: {
      id: { in: [6, 5] },
    },
    select: {
      name: true,
    },            
    orderBy: [
      {
        id: 'desc',
      },
    ],
  })

  • group by の実行 , select項目の指定

https://www.prisma.io/docs/concepts/components/prisma-client/select-fields

https://www.prisma.io/docs/reference/api-reference/prisma-client-reference#groupby

    const posts = await prisma.temp1.groupBy({
      by: ['name' ],
      select: {
        name: true,
      },
      sum: {
        price: true,
      },                  
    })
  • findMany : skip , take (pagination)

https://www.prisma.io/docs/concepts/components/prisma-client/pagination

    const posts = await prisma.task.findMany({
      orderBy: [
        {
          id: 'desc',
        },
      ],      
      skip: 0,
      take: 10,      
    })

■ 関連のページ

  • Prisma ORM / sqlite を試す例

https://zenn.dev/knaka0209/articles/cbaad75d6df881


Discussion