🤶

ローカルでDrizzle StudioとD1 Driverを使用する際の注意点

2023/12/24に公開

こんにちは (@sugar235711)です。
この記事はCloudflare Advent Calendar 2023 24日目の記事です。
https://qiita.com/advent-calendar/2023/cloudflare

はじめに

この記事はCloudflare D1 Drizzle関連のライブラリを使用した時に発生したIssueについての紹介です。
(あんまりCloudflareに関係ないかもしれません、ごめんなさい)


現状drizzle-kitのリポジトリ自体はまだ公開されておらず、↓issueの対応はまだ先になりそうなので、とりあえずの一次対応としてメモを残します。
https://github.com/drizzle-team/drizzle-kit-mirror/issues/242


Cloudflare Workers + Cloudflare D1の構成でORMを選ぶ際に、最近ではクエリビルダーにDrizzle ORMを採用する方が多いと思います。

このDrizzle ORMですが、Drizzle Teamが提供するライブラリ群の中のうちの一つで、クエリビルダーの機能を提供するDrizzle ORMの他に、DDLの生成やマイグレーションなどの機能を提供するDrizzle Kitというライブラリがあります。

このDrizzle KitからDrizzle Studioというブラウザ上でSQLクエリの発行やViewを確認できる便利なSQLクライアントのツールが提供されています。

https://orm.drizzle.team/drizzle-studio/overview

このDrizzle StudioをCloudflare D1で使用する場合、drizzle.configd1というドライバーを指定し、wrangler.tomlに記載されているDB名の情報を記述し、drizzle-kit studioでサーバーを起動することで、リモートのD1に接続することができます。

drizzle.config.ts
import type { Config } from 'drizzle-kit'

const cfConfig = {
  schema: './schema/db/schema.ts',
  out: './schema/db/migrations',
  driver: 'd1',
  dbCredentials: {
    wranglerConfigPath: './wrangler.toml',
    dbName: 'test-app',
  },
  verbose: false,
  strict: true,
} satisfies Config
wrangler.toml
name = "api"
compatibility_date = "2023-10-16"
send_metrics = false
node_compat = true
main = "cmd/server/index.ts"


[[d1_databases]]
binding = "DB"
database_name = "test-db"
database_id = "xxx"
migrations_dir = "./schema/db/migrations"

しかし、この設定方法ではDrizzle StudioからはローカルのD1に接続できません。
(wrangler devのようにCloudflare用のRuntimeを使用し、内部的にローカルのsqliteを使用するように切り替えてくれていないため)

現状DrizzleのConfigの型定義を見る限り、driver: "d1"の場合はローカルのD1に接続する方法は用意されていないように見えます。

export type Config = {
    out?: string | undefined;
    breakpoints?: boolean | undefined;
    tablesFilter?: string | string[] | undefined;
    schemaFilter?: string | string[] | undefined;
    schema?: string | string[];
    verbose?: boolean | undefined;
    strict?: boolean | undefined;
} (
    // ...
    {
    driver: "d1";
    dbCredentials: {
        wranglerConfigPath: string;
        dbName: string;
    };
} | {});

なので、ローカルでD1を使用する場合は、drizzle.configdriverbetter-sqliteに変更し、dbCredentialswranglerのコマンドによって生成されたsqliteのバイナリを指定してあげる必要があります。

参考実装↓
https://github.com/sugar-cat7/d1-drizzle-studio/blob/main/service/api/drizzle.config.ts

これでとりあえずはローカルのD1に対してDrizzle Studioを使用することができます。
image

他に良い方法あったら教えてください。

Discussion