ローカルのD1をDrizzle Studioで開く

2024/09/21に公開

現バージョンではCloudflareのD1でDrizzle Studioを開こうとすると以下のようなエラーが発生します。

ちなみにDrizzle Studioとはこちらのことです。
https://orm.drizzle.team/drizzle-studio/overview

Error: 7003: Could not route to /client/v4/accounts/account-id/d1/database/database-id/query, perhaps your object identifier is invalid?
    at _ (https://local.drizzle.studio/index.js:14123:33353)
    at async https://local.drizzle.studio/index.js:14123:33544
    at async Promise.all (index 2)
    at async gri (https://local.drizzle.studio/index.js:14060:1111)
    at async ykl (https://local.drizzle.studio/index.js:14123:33525)

対処法

ローカル用のファイルを別に作成して、Drizzle Studioを開くようにしました。

$ drizzle-kit studio --config drizzle.config.local.ts
drizzle-kit: v0.22.8
drizzle-orm: v0.31.4

Custom config path was provided, using 'drizzle.config.local.ts'
Reading config file 'C:\Users\m\Documents\hascii\api\drizzle.config.local.ts'

もし以下のようなエラーが出たら'@libsql/client'をインストールします。

Please install either 'better-sqlite3' or '@libsql/client' for Drizzle Kit to connect to SQLite databases
error: script "studio" exited with code 1

こんな感じです。

$ bun i @libsql/client -D

ローカル用の設定ファイルはこのようにしました。

import type { Config } from "drizzle-kit"
import { readdirSync } from "node:fs"

const fileNames = readdirSync(
  ".wrangler/state/v3/d1/miniflare-D1DatabaseObject",
)

const fileName = fileNames.find((fileName) => {
  return fileName.endsWith(".sqlite")
})

if (fileName === undefined) {
  throw new Error("No sqlite file found")
}

/**
 * $ bun drizzle-kit studio --config drizzle.config.local.ts
 */
export default {
  dialect: "sqlite",
  schema: "drizzle.schema.ts",
  out: "migrations",
  dbCredentials: {
    url: `.wrangler/state/v3/d1/miniflare-D1DatabaseObject/${fileName}`,
  },
} satisfies Config

おまけ

リレーションが不足しているとこのようなエラーがでます。schemaを修正してからもう一度実行します。

Error: There is not enough information to infer relation "__public__.posts.likes"
    at https://local.drizzle.studio/index.js:14120:428
    at async ykl (https://local.drizzle.studio/index.js:14123:32387)

Discussion