Skip to content

Instantly share code, notes, and snippets.

@mizchi
Last active December 23, 2023 08:12
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mizchi/1748ca3a6711999adf51353f3500e0ac to your computer and use it in GitHub Desktop.
Save mizchi/1748ca3a6711999adf51353f3500e0ac to your computer and use it in GitHub Desktop.

やりたいこと(超訳)

  • d1 を prisma で動かしたい
  • prisma-query-wasm がどれだけ小さくなるか検証
    • query builder 部分だけ取り出せないか
  • PR 出せたらいいね

動機

  • (mizchi の考える)次世代の銀の弾丸
    • cloudflare workers(or pages)
    • vite ssr framework
      • remix
      • qwik-city
    • d1 + ORM?
      • kysely とか drizzle とかあるけど使いづらい
      • 使いやすさと普及度の観点から prisma 使いたい
  • 手軽さのために cloudflare スタックで完結させたい
  • (実現できれば)安くて速くて手軽

cloudflare workers の制限

  • workers の制限
    • フリープランのサイズ上限 1MB
    • 有料プランで $5/m で 10MB
    • ネイティブプラグインが使えない(wasmは可)
  • d1
    • CDN Edge で動く sqlite
    • sqlite 互換(を目指している。現状不完全)

d1 の互換性に関しては今回のスコープ外(ベータまでには仕上がってくると思うので)

Prisma + D1 の問題

  • prisma-engine(クエリビルダ+実行+プロファイラ) が Rust
    • d1 環境なら wasm で動かす必要がある
  • @prisma/query-engine-wasm が 3.0MB
    • 有料プランで動かなくはないがスケール面で不利
  • @prisma/client/edge は別サーバーへのプロキシ

d1 example

$ npm create cloudflare@latest workers-prisma
$ pnpm install
$ pnpm wrangler d1 create mydb4
export interface Env {
	DB: D1Database;
}

export default {
  async fetch(
    request: Request,
    env: Env,
    ctx: ExecutionContext
  ): Promise<Response> {
    const db = env.DB;
    const ret = await db.exec('select 1');
    return Response.json(ret);
  },
};

実際のアダプタ部分は db.exec(sql)db.prepare(sql).run()

https://developers.cloudflare.com/d1/platform/client-api/

調査結果

  • query-engine-wasm が 3.0MB
  • psl(prisma-schema-language) で 660k
    • ランタイムにスキーマのパーサいらないのでは
  • mysql/postrgesql/mssql/mongodb アダプタも同梱されてる
    • d1 だけなら sqlite のみでよいはず
  • tokio でかいんじゃないか?
  • twiggy がうまく使えなかった

今日やりたいこと

  • やりたいこと
    • Rust のビルドサイズ
  • やらないこと
    • アダプタの実装
    • d1 自体の未実装部分の調査
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment