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();
}
}