【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が利用できる。
詳しくは公式サイトへ!
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
は指定しておいたほうが良い。
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 形式で書かれている...。
そこで TypeScript の Extract
を利用して dialect: 'sqlite', driver ?: never
のものを抽出している。
never
を指定するとキーに存在しないものが抽出できて便利。
結果はこんな感じ。
これを利用して casing
と logger
を紐づけている。
おわりに
共通化してみたはいいが、そんなに共通化できる設定が無かった...。
まぁこれが PostgreSQL
などになれば項目が増えるので、良いかもしれない。
今まだ v1.0 ではないので、上記設定もいつかは本体に組み込まれるのではないかn。
続き
Drizzle ORM でダミーデータを流し込む方法 #TypeScript - Qiita
https://qiita.com/sigeta/items/8bc85b74273eeb37c27a