ローカルでDrizzle StudioとD1 Driverを使用する際の注意点
こんにちは (@sugar235711)です。
この記事はCloudflare Advent Calendar 2023 24日目の記事です。
はじめに
この記事はCloudflare D1 Drizzle関連のライブラリを使用した時に発生したIssueについての紹介です。
(あんまりCloudflareに関係ないかもしれません、ごめんなさい)
現状drizzle-kit
のリポジトリ自体はまだ公開されておらず、↓issueの対応はまだ先になりそうなので、とりあえずの一次対応としてメモを残します。
Cloudflare Workers + Cloudflare D1の構成でORMを選ぶ際に、最近ではクエリビルダーにDrizzle ORM
を採用する方が多いと思います。
このDrizzle ORMですが、Drizzle Teamが提供するライブラリ群の中のうちの一つで、クエリビルダーの機能を提供するDrizzle ORMの他に、DDLの生成やマイグレーションなどの機能を提供するDrizzle Kit
というライブラリがあります。
このDrizzle Kit
からDrizzle Studio
というブラウザ上でSQLクエリの発行やViewを確認できる便利なSQLクライアントのツールが提供されています。
このDrizzle Studio
をCloudflare D1で使用する場合、drizzle.config
にd1
というドライバーを指定し、wrangler.toml
に記載されているDB名の情報を記述し、drizzle-kit studio
でサーバーを起動することで、リモートのD1に接続することができます。
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
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.config
のdriver
をbetter-sqlite
に変更し、dbCredentials
をwrangler
のコマンドによって生成されたsqliteのバイナリを指定してあげる必要があります。
参考実装↓
これでとりあえずはローカルのD1に対してDrizzle Studio
を使用することができます。
他に良い方法あったら教えてください。
Discussion