node.js / Prisma ORM / mysql を試す例
概要:
前の Prisma 初級編の続編となり。mysql操作するメモとなります
- Getting started を例を試しました。
環境
- node 14
- prisma: 2.20.0
- mysql: 5.7.33
参考
■ 試した内容
- 上記の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
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
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 を試す例
Discussion