@runlot/pg
v0.1.0-rc.145
Published
node-postgres-compatible adapter for env.db, with adapters for six ORMs
Readme
@runlot/pg
env.db 위에서 node-postgres(pg) 모양으로 쓰는 어댑터입니다. 이미 pg 를 쓰는 코드와
ORM 을 고치지 않고 runlot 의 데이터베이스에 붙일 수 있습니다.
import { Pool } from "@runlot/pg";
export default {
async fetch(req, env) {
const pool = new Pool({ db: env.db });
const { rows } = await pool.query("select id, name from users where id = $1", [1]);
return Response.json(rows);
},
};무엇을 할 수 있나요
Pool.query(text, values)— 호출마다 새 세션입니다. 문장 하나짜리 질의에 알맞습니다.Pool.connect()/new Client({ db })— 세션 하나를 쥐어요.BEGIN … COMMIT, prepared statement,SET이 그 안에서 유지됩니다.release()나end()로 돌려주세요.- 오류는
DatabaseError로 던지고err.code가 SQLSTATE 입니다 (23505같은 값). types.setTypeParser(oid, fn)으로 타입 변환을 바꿀 수 있어요. 기본은pg와 같습니다 —timestamptz·date는Date,int8·numeric은 문자열입니다.
ORM
| ORM | 쓰는 법 |
|---|---|
| Prisma | import { PrismaRunlot } from "@runlot/pg/prisma" → new PrismaClient({ adapter: new PrismaRunlot(env.db) }) |
| Drizzle | import { drizzle } from "@runlot/pg/drizzle" → drizzle(env.db, { schema }) |
| Kysely | import { kysely } from "@runlot/pg/kysely" → kysely<DB>(env.db) |
| TypeORM | import { dataSource } from "@runlot/pg/typeorm" → dataSource(env.db, { entities }) |
| Sequelize | import { sequelize } from "@runlot/pg/sequelize" → sequelize(env.db) |
| Knex | import { knex } from "@runlot/pg/knex" → knex(env.db) |
runlot deploy 로 배포하면 따로 할 일이 없습니다. 배포 번들러(@runlot/pg/bundler)가
pg 를 이 패키지로 풀고, ORM 이 node 내장 모듈을 쓰면 nodejs_compat 를,
Prisma 의 WASM 쿼리 컴파일러는 별도 모듈로 runlot.json 에 적습니다.
다른 도구로 직접 묶는다면 같은 일을 해야 합니다: pg → @runlot/pg alias,
node 내장은 node: 접두로 외부에 두고 매니페스트에 "compatibilityFlags":
["nodejs_compat"], fs·os·tty 는 빈 스텁, .wasm 은 번들 밖 모듈로 두고
매니페스트 modules 에 { "name", "type": "wasm", "path" } 로 적습니다. buildWorker
를 직접 불러도 됩니다:
import { buildWorker } from "@runlot/pg/bundler";
const { code, report } = await buildWorker({ entry: "src/index.ts", absWorkingDir: process.cwd() });
// report.nodeImports 가 비어 있지 않으면 nodejs_compat, report.wasmModules 는 곁에 실을 파일개발
pnpm --filter @runlot/pg test # 가짜 env.db 상대 단위 시험
pnpm --filter @runlot/pg e2e:build # e2e/*.ts → e2e-dist/*.js (실물 workerd 시험용)
go test ./node/internal/workerd -run TestLiveORM -v # 실물 workerd 위 ORM 별 E2E