Drizzle <> Cloudflare D1

This guide assumes familiarity with:

Drizzle ORM은 Cloudflare Durable Objects 데이터베이스와 Cloudflare Workers 환경을 완벽하게 지원합니다.
Drizzle는 SQL 방언과 방언별 드라이버 및 구문을 수용하며, SQLite와 유사한 all, get, values, run 쿼리 메서드 구문을 대부분 구현합니다.

Cloudflare Durable Objects를 위한 프로젝트 설정은 **공식 문서**를 참고하세요.

1단계 - 패키지 설치

npm
yarn
pnpm
bun
npm i drizzle-orm
npm i -D drizzle-kit

2단계 - 드라이버 초기화 및 쿼리 실행

Durable Objects 데이터베이스를 사용하려면 wrangler.toml 파일이 필요합니다. 이 파일은 다음과 같이 구성됩니다:

#:schema node_modules/wrangler/config-schema.json
name = "sqlite-durable-objects"
main = "src/index.ts"
compatibility_date = "2024-11-12"
compatibility_flags = [ "nodejs_compat" ]

# Durable Object 바인딩. Durable Objects는 액터 모델을 기반으로 한 스케일-투-제로 컴퓨팅 프리미티브입니다.
# Durable Objects는 필요한 만큼 오래 유지될 수 있습니다. 실시간 앱과 같이 장기 실행 "서버"가 필요할 때 사용합니다.
# 문서: https://developers.cloudflare.com/workers/wrangler/configuration/#durable-objects
[[durable_objects.bindings]]
name = "MY_DURABLE_OBJECT"
class_name = "MyDurableObject"

# Durable Object 마이그레이션.
# 문서: https://developers.cloudflare.com/workers/wrangler/configuration/#migrations
[[migrations]]
tag = "v1"
new_sqlite_classes = ["MyDurableObject"]

# 다음 단계에서 마이그레이션을 가져올 수 있도록 규칙이 필요합니다.
[[rules]] 
type = "Text"
globs = ["**/*.sql"]
fallthrough = true

첫 번째 Durable Objects SQLite 쿼리를 실행해 보겠습니다:

/// 
import { drizzle, DrizzleSqliteDODatabase } from 'drizzle-orm/durable-sqlite';
import { DurableObject } from 'cloudflare:workers'
import { migrate } from 'drizzle-orm/durable-sqlite/migrator';
import migrations from '../drizzle/migrations';
import { usersTable } from './db/schema';

export class MyDurableObject extends DurableObject {
	storage: DurableObjectStorage;
	db: DrizzleSqliteDODatabase;

	constructor(ctx: DurableObjectState, env: Env) {
		super(ctx, env);
		this.storage = ctx.storage;
		this.db = drizzle(this.storage, { logger: false });
	}

    async migrate() {
        migrate(this.db, migrations);
    }

	async insert(user: typeof usersTable.$inferInsert) {
        await this.db.insert(usersTable).values(user);
    }

	async select() {
        return this.db.select().from(usersTable);
    }
}

export default {
	/**
	 * 이는 Cloudflare Worker의 표준 fetch 핸들러입니다.
	 *
	 * @param request - 클라이언트에서 Worker로 전송된 요청
	 * @param env - wrangler.toml에 선언된 바인딩을 참조하는 인터페이스
	 * @param ctx - Worker의 실행 컨텍스트
	 * @returns 클라이언트에게 반환될 응답
	 */
	async fetch(request: Request, env: Env): Promise {
		const id: DurableObjectId = env.MY_DURABLE_OBJECT.idFromName('durable-object');
		const stub = env.MY_DURABLE_OBJECT.get(id);
		await stub.migrate();

		await stub.insert({
			name: 'John',
			age: 30,
			email: 'john@example.com',
		});
		console.log('새 사용자가 생성되었습니다!');
	
		const users = await stub.select();
		console.log('데이터베이스에서 모든 사용자 가져오기: ', users);

        return new Response();
    }
}

다음 단계는 무엇인가요?