Drizzle <> Cloudflare D1
This guide assumes familiarity with:
Drizzle를 사용한 데이터베이스 연결 기본 사항
Cloudflare SQLite Durable Objects - Durable Object 내에 내장된 SQLite 데이터베이스 - 여기서 읽어보기
Drizzle ORM은 Cloudflare Durable Objects 데이터베이스와 Cloudflare Workers 환경을 완벽하게 지원합니다.
Drizzle는 SQL 방언과 방언별 드라이버 및 구문을 수용하며, SQLite와 유사한 all
, get
, values
, run
쿼리 메서드 구문을 대부분 구현합니다.
Cloudflare Durable Objects를 위한 프로젝트 설정은 **공식 문서 **를 참고하세요.
1단계 - 패키지 설치
npm i drizzle-orm
npm i -D drizzle-kit
yarn add drizzle-orm
yarn add -D drizzle-kit
pnpm add drizzle-orm
pnpm add -D drizzle-kit
bun add drizzle-orm
bun add -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 ();
}
}
다음 단계는 무엇인가요?