0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Drizzle ORM の設定ファイルを接続時も利用する方法

Last updated at Posted at 2025-03-30

【Drizzle ORM シリーズ】
・Drizzle ORM を Next.js で使ってみる #Next.js - Qiita
 https://qiita.com/sigeta/items/c0a2b0463eca06314906
・Drizzle ORM でスキーマファイルを使ってDBを操作する方法 #Next.js - Qiita
 https://qiita.com/sigeta/items/99a625c17c6a0a75da54
・Drizzle ORM でリレーションを張る方法 #Next.js - Qiita
 https://qiita.com/sigeta/items/b800f3e38beb1639d2b7
・Drizzle ORM の設定ファイルを接続時も利用する方法 #TypeScript - Qiita
 https://qiita.com/sigeta/items/d9267a06061d4d2a51e8
・Drizzle ORM でダミーデータを流し込む方法 #TypeScript - Qiita
 https://qiita.com/sigeta/items/8bc85b74273eeb37c27a

Drizzle ORM には drizzle.config.ts という設定ファイルが用意されている。
しかし、これは drizzle-kit の CLI コマンドでしか利用されない。

意図としては、DBアクセス用に2つアカウントを作って、

  • migration 用のシステムアカウント
  • アプリからの接続に使うアカウント

と運用するべきな気もする。

しかし、Laravel になれた私からすると、設定要件は一か所にまとめたい気持ちが強い...。

ということで共通化しました。

設定

SQLite を前提で作成しているが、PostgreSQL など様々なDBが利用できる。
詳しくは公式サイトへ!

drizzle.config.ts
import { Config, defineConfig } from 'drizzle-kit'
import process from 'node:process'

process.loadEnvFile()

export default defineConfig({
    dialect: 'sqlite',
    schema: './db/schema.ts',
    out: './db/drizzle',
    casing: 'snake_case',
    introspect: { casing: 'camel' },
    verbose: Boolean(process.env.VERBOSE),
    dbCredentials: {
        url: process.env.DATABASE_URL!,
    },
}) satisfies Config

ポイントは以下!

  • casing: snake_case | camelCase
    • 列キーの命名規則を設定する
  • introspect.casing: camel | preserve
    • 列キーの大文字小文字を区別する
  • verbose: true | false
    • 実行されるSQLを console に出力する
  • dbCredentials
    • DBへの接続情報

一般的に列名は snake_case 、TypeScript内の変数は lower_upper_case で書く。
なので casing は指定しておいたほうが良い。

db/index.ts
import { drizzle, type BetterSQLite3Database } from 'drizzle-orm/better-sqlite3'
import Database from 'better-sqlite3'
import * as schema from './schema'
import drizzleConfig from '@/drizzle.config'

const config = drizzleConfig as
  Extract<typeof drizzleConfig, { dialect: 'sqlite', driver?: never }>

const sqlite = new Database(config.dbCredentials.url)
export const db: BetterSQLite3Database<typeof schema> = drizzle(sqlite, {
  schema,
  casing: config.casing,
  logger: config.verbose,
})

接続側では、先ほどの設定ファイルをインポートして利用する。
この時 drizzleConfig は外から利用する想定で作られていないため、
全ての型が OR 形式で書かれている...。

image.png

そこで TypeScript の Extract を利用して dialect: 'sqlite', driver ?: never のものを抽出している。
never を指定するとキーに存在しないものが抽出できて便利。

結果はこんな感じ。

image.png

これを利用して casinglogger を紐づけている。

おわりに

共通化してみたはいいが、そんなに共通化できる設定が無かった...。
まぁこれが PostgreSQL などになれば項目が増えるので、良いかもしれない。

今まだ v1.0 ではないので、上記設定もいつかは本体に組み込まれるのではないかn。

続き
Drizzle ORM でダミーデータを流し込む方法 #TypeScript - Qiita
https://qiita.com/sigeta/items/8bc85b74273eeb37c27a

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?