カテゴリー
【Prisma入門】ローカル環境できるPrismaを使い始めたい人のためのRDB操作ガイド
※ 当ページには【広告/PR】を含む場合があります。
2023/02/28
目次
- 1. PrismaでSQLiteを使ってみる
- 2. Prismaクライアントでテーブルを操作する
- 2-1. 【Create系】データベースのテーブルへレコードを一つ追加する
- 2-2. 【Create系】データベースのテーブルへレコードを一括追加する(バルクインサート)
- 2-3. 【Delete系】データベースのテーブルからレコードを一つ削除する
- 2-4. 【Delete系】データベースのテーブルからレコードを一括削除する
- 2-5. 【Read系】テーブル内を検索してレコードを一つ取得する
- 2-6. 【Read系】テーブル内の検索して条件を満たすレコードを全て取得する
- 2-7. 【Update系】テーブルの一つのレコードの更新する
- 2-8. 【Update系】テーブル中の条件を満たすレコードを一括更新(バルクアップデート)する
- 3. まとめ
リレーショナルデータベース(RDB)とプログラミング言語の間の
非互換なデータを変換するプログラミング技法
PostgreSQL
MySQL
SQLite
SQL Server
MongoDB
CockroachDB
1. Prismaプロジェクトの構築方法を理解する
2. Prismaクライアントの各種メソッドの使い方(CRUD)を学ぶ
レコード作成(Create)系 ... create/createMany
レコード削除(Delete)系 ... delete/deleteMany
レコード取得(Read)系 ... findUnique/findFirst/findMany
レコード更新(Update)系 ... update/upsert/updateMany
PrismaでSQLiteを使ってみる
yarn
$ mkdir prisma-sqlite
$ cd prisma-sqlite/
$ yarn init -y
$ yarn add typescript ts-node @types/node -D
$ npx tsc --init
$ yarn add prisma -D
$ npx prisma init --datasource-provider sqlite
Prismaスキーマを定義する
Prismaスキーマ
schema.prisma
prisma init
prisma
schema.prisma
// This is your Prisma schema file,
// learn more about it in the docs: https://pris.ly/d/prisma-schema
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "sqlite"
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?
published Boolean @default(false)
author User @relation(fields: [authorId], references: [id])
authorId Int
}
Prismaスキーマから空のデータベースをマイグレする
prisma migrate
dev
dev
npx prisma migrate dev --help
$ npx prisma migrate dev --name hoge
prisma/dev.db
Prismaクライアントでテーブルを操作する
dev.db
typescript
【Create系】データベースのテーブルへレコードを一つ追加する
dev.db
User
pushOne.ts
$ touch pushOne.ts
import { PrismaClient } from "@prisma/client";
const prisma = new PrismaClient();
async function main() {
const user = await prisma.user.create({
data: {
name: 'Alice',
email: 'alice@example.com'
}
});
console.dir(user);
};
main()
.catch(e => {
console.error(e);
process.exit(1);
})
.finally(async () => {
await prisma.$disconnect();
});
ts-node
$npx ts-node pushOne.ts
{ id: 1, email: 'alice@example.com', name: 'Alice' }
prisma.<テーブル名>
$ yarn add @faker-js/faker -D
pushRandom.ts
$ touch pushRandom.ts
import { PrismaClient } from "@prisma/client";
import { faker } from '@faker-js/faker';
const prisma = new PrismaClient();
async function main() {
const user = await prisma.user.create({
data: {
name: faker.name.firstName(),
email: faker.internet.email(),
}
});
console.dir(user);
};
main()
.catch(e => {
console.error(e);
process.exit(1);
})
.finally(async () => {
await prisma.$disconnect();
});
$ npx ts-node pushRandom.ts
{ id: 2, email: 'Uriel2@gmail.com', name: 'Mattie' }
$ npx ts-node pushRandom.ts
{ id: 3, email: 'Ethyl_Price93@yahoo.com', name: 'Vivienne' }
$ npx ts-node pushRandom.ts
{ id: 4, email: 'Floyd_Mohr60@hotmail.com', name: 'Gregorio' }
$ npx ts-node pushRandom.ts
{ id: 5, email: 'Kaycee_Schmitt@gmail.com', name: 'Julien' }
【Create系】データベースのテーブルへレコードを一括追加する(バルクインサート)
createMany
import { PrismaClient } from "@prisma/client";
import { faker } from '@faker-js/faker';
const prisma = new PrismaClient();
const count = 5;
async function main() {
const user = await prisma.user.createMany({
data: [...Array(count)].map(() => {
return {
name: faker.name.firstName(),
email: faker.internet.email(),
}
})
});
console.dir(user);
};
main()
.catch(e => {
console.error(e);
process.exit(1);
})
.finally(async () => {
await prisma.$disconnect();
});
createメソッド
import { PrismaClient } from "@prisma/client";
import { faker } from '@faker-js/faker';
const prisma = new PrismaClient();
const count = 5;
async function main() {
await Promise.all(
[...Array(count)].map(async () => {
await prisma.user.create({
data: {
name: faker.name.firstName(),
email: faker.internet.email(),
}
});
})
);
};
main()
.catch(e => {
console.error(e);
process.exit(1);
})
.finally(async () => {
await prisma.$disconnect();
});
npx ts-node pushMany.ts
【Delete系】データベースのテーブルからレコードを一つ削除する
detele
1. ID
2. 一意に決まる属性値
import { PrismaClient } from "@prisma/client";
const prisma = new PrismaClient();
async function main() {
const deleteUser = await prisma.user.delete({
where: { id: 1 }
});
console.dir(deleteUser);
};
main()
.catch(e => {
console.error(e);
process.exit(1);
})
.finally(async () => {
await prisma.$disconnect();
});
delete
where: {id: 1}
$npx ts-node deleteOne.ts
{ id: 1, email: 'alice@example.com', name: 'Alice' }
【Delete系】データベースのテーブルからレコードを一括削除する
deleteMany
import { PrismaClient } from "@prisma/client";
const prisma = new PrismaClient();
async function main() {
const deleteUsers = await prisma.user.deleteMany({
where: {
id: {
gte: 7
}
}
});
console.dir(deleteUsers);
};
main()
.catch(e => {
console.error(e);
process.exit(1);
})
.finally(async () => {
await prisma.$disconnect();
});
where: { id: {gte: 7} }
$ npx ts-node deleteMany.ts
{ count: 4 }
count: 4
【Read系】テーブル内を検索してレコードを一つ取得する
findUnique
findFirst
findUnique:
IDか一意に識別できる条件を指定してレコードを取得
findFirst:
指定した条件に一致する最初のレコードを取得
findUnique
findFirst
findUnique
import { PrismaClient } from "@prisma/client";
const prisma = new PrismaClient();
async function main() {
const foundUser = await prisma.user.findUnique({
where: { id: 4 }
});
console.dir(foundUser);
};
main()
.catch(e => {
console.error(e);
process.exit(1);
})
.finally(async () => {
await prisma.$disconnect();
});
delete
findUnique
where
$ npx ts-node findOne.ts
{ id: 4, email: 'Floyd_Mohr60@hotmail.com', name: 'Gregorio' }
【Read系】テーブル内の検索して条件を満たすレコードを全て取得する
findFirst
findMany
import { PrismaClient } from "@prisma/client";
const prisma = new PrismaClient();
async function main() {
const foundUsers = await prisma.user.findMany({
where: { id: {lte: 6} }
});
console.dir(foundUsers);
};
main()
.catch(e => {
console.error(e);
process.exit(1);
})
.finally(async () => {
await prisma.$disconnect();
});
$ npx ts-node findMany.ts
[
{ id: 2, email: 'Uriel2@gmail.com', name: 'Mattie' },
{ id: 3, email: 'Ethyl_Price93@yahoo.com', name: 'Vivienne' },
{ id: 4, email: 'Floyd_Mohr60@hotmail.com', name: 'Gregorio' },
{ id: 5, email: 'Kaycee_Schmitt@gmail.com', name: 'Julien' },
{ id: 6, email: 'Destinee89@gmail.com', name: 'Raphaelle' }
]
【Update系】テーブルの一つのレコードの更新する
「作成」
「削除」
「取得」
「更新」
update
upsert
update:
IDまたは一意に決まる条件に一致するレコードを更新する。
テーブルに存在しない場合には何もしない
upsert:
IDまたは一意に決まる条件に一致するレコードを更新する。
テーブルに存在しない場合にはレコードを新規追加する
update
import { PrismaClient } from "@prisma/client";
import { faker } from '@faker-js/faker';
const prisma = new PrismaClient();
async function main() {
const updatedUser = await prisma.user.update({
where: {id: 2},
data: {
name: faker.name.firstName(),
email: faker.internet.email(),
}
});
console.dir(updatedUser);
};
main()
.catch(e => {
console.error(e);
process.exit(1);
})
.finally(async () => {
await prisma.$disconnect();
});
$ npx ts-node updateOne.ts
{ id: 2, email: 'Sheila94@gmail.com', name: 'Elvera' }
【Update系】テーブル中の条件を満たすレコードを一括更新(バルクアップデート)する
update
updateMany
updateMany
gmail
import { PrismaClient } from "@prisma/client";
import { faker } from '@faker-js/faker';
const prisma = new PrismaClient();
async function main() {
const updatedUserCount = await prisma.user.updateMany({
where: { email: {contains: 'gmail'} },
data: {name: faker.name.firstName()}
});
console.dir(updatedUserCount);
};
main()
.catch(e => {
console.error(e);
process.exit(1);
})
.finally(async () => {
await prisma.$disconnect();
});
$ npx ts-node updateMany.ts
{ count: 3 }
updateMany
update
updateMany
まとめ
1. Prismaプロジェクトの構築方法を理解する
2. Prismaクライアントの各種メソッドの使い方(CRUD)を学ぶ
レコード作成(Create)系 ... create/createMany
レコード削除(Delete)系 ... delete/deleteMany
レコード取得(Read)系 ... findUnique/findFirst/findMany
レコード更新(Update)系 ... update/upsert/updateMany
記事を書いた人
ナンデモ系エンジニア
主にAngularでフロントエンド開発することが多いです。 開発環境はLinuxメインで進めているので、シェルコマンドも多用しております。 コツコツとプログラミングするのが好きな人間です。
カテゴリー
- 1. PrismaでSQLiteを使ってみる
- 2. Prismaクライアントでテーブルを操作する
- 2-1. 【Create系】データベースのテーブルへレコードを一つ追加する
- 2-2. 【Create系】データベースのテーブルへレコードを一括追加する(バルクインサート)
- 2-3. 【Delete系】データベースのテーブルからレコードを一つ削除する
- 2-4. 【Delete系】データベースのテーブルからレコードを一括削除する
- 2-5. 【Read系】テーブル内を検索してレコードを一つ取得する
- 2-6. 【Read系】テーブル内の検索して条件を満たすレコードを全て取得する
- 2-7. 【Update系】テーブルの一つのレコードの更新する
- 2-8. 【Update系】テーブル中の条件を満たすレコードを一括更新(バルクアップデート)する
- 3. まとめ