npm プロジェクトの初期化
npm init
指示通り設定を埋めていくと、 package.json
が生成される。
必要パッケージのインストール
npm i drizzle-orm pg dotenv
npm i -D drizzle-kit tsx @types/pg typescript
- dependencies
drizzle-orm
: ORM 本体pg
: PostgreSQL へ接続するための Driverdotenv
: 接続先設定を env に記述するために利用
- devDependencies
drizzle-kit
: スキーマファイル生成や、マイグレーション等を行うのに利用tsx
: 謎。チュートリアルに入っていたから入れた。@types/pg
:pg
の型情報typescript
: TypeScript トランスパイルに利用
DB 接続設定の作成
.env
ファイルに接続先設定を記述する。
echo 'DATABASE_URL=postgres://postgres:postgres@postgres/postgres' > .env
TypeScript 設定ファイル(tsconfig.json)の作成
tsconfig.json
の作成
tsc
コマンドで、 tsconfig.json
を作成する
npx tsc --init
tsconfig.json
のパラメーター編集
以下表のとおりパラメーターを設定。
パラメーター | 値 |
---|---|
outDir |
./dist |
ここまでの動作確認
ひとまず TypeScript をコンパイル・実行できるかを確認。
mkdir src
echo 'console.log("Hello, World!");' > ./src/index.ts
tsc
node ./dist/index.js
Hello, World!
が表示される … ok!
Drizzle の設定
コネクション初期化処理の作成
以下の通りコネクション初期化処理を作成。
mkdir -p ./src/db
cat << EOF > ./src/db/index.ts
import 'dotenv/config';
import { drizzle } from 'drizzle-orm/node-postgres';
const db = drizzle(process.env.DATABASE_URL!);
EOF
Drizzle の設定ファイル作成
以下の通り設定ファイルを作成。
cat << EOF > ./drizzle.config.ts
import 'dotenv/config';
import { defineConfig } from 'drizzle-kit';
export default defineConfig({
out: './drizzle',
schema: './src/db/schema.ts',
dialect: 'postgresql',
dbCredentials: {
url: process.env.DATABASE_URL!,
},
});
EOF
DB スキーマの作成
TypeScript でスキーマを書いていく。
以下コードを見れば、どんなスキーマを作りたいのかわかるはず…
cat << EOF > ./src/db/schema.ts
import { integer, pgTable, varchar } from "drizzle-orm/pg-core";
export const usersTable = pgTable("users", {
id: integer().primaryKey().generatedAlwaysAsIdentity(),
name: varchar({ length: 255 }).notNull(),
age: integer().notNull(),
email: varchar({ length: 255 }).notNull().unique(),
});
EOF
マイグレーションファイルの生成と適用
マイグレーションファイルの生成
npx drizzle-kit generate
設定ファイルの out
に指定したとおり、
./drizzle
にマイグレーションファイルが出力される。
マイグレーションファイルの適用
migration
サブコマンドで生成したマイグレーションファイルを DB に反映させる。
npx drizzle-kit migrate
A5:SQL-Mk2 で確認してみると、確かにテーブルが作成されている … ok!
メインファイルの作成
作成した Drizzle の設定で、DB にアクセスし、 CRD するアプリケーションを作成する。
cat <<"EOF" > ./src/index.ts
import 'dotenv/config';
import { drizzle } from 'drizzle-orm/node-postgres';
import { eq } from 'drizzle-orm';
import { usersTable } from './db/schema';
const db = drizzle(process.env.DATABASE_URL!);
async function main() {
const user: typeof usersTable.$inferInsert = {
name: 'John',
age: 30,
email: 'john@example.com',
};
await db.insert(usersTable).values(user);
console.log('New user created!')
const users = await db.select().from(usersTable);
console.log('Getting all users from the database: ', users)
/*
const users: {
id: number;
name: string;
age: number;
email: string;
}[]
*/
await db
.update(usersTable)
.set({
age: 31,
})
.where(eq(usersTable.email, user.email));
console.log('User info updated!')
await db.delete(usersTable).where(eq(usersTable.email, user.email));
console.log('User deleted!')
}
main();
EOF
動作確認
ビルド
npx tsc
node ./dist/src/index.js
実行
node ➜ /workspaces $ node ./dist/src/index.js
New user created!
Getting all users from the database: [ { id: 1, name: 'John', age: 30, email: 'john@example.com' } ]
User info updated!
User deleted!
ok! 以上。