0Pricing
TypeScript Academy · レッスン

型安全なクエリ構築

コンパイル時に無効なカラムを拒否するクエリを構築します。

「型安全なクエリ構築」はCoddyKit上の無料TypeScript Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはTypeScript Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 TypeScript Academyコースには全4レッスンが含まれています。

未知のカラムを参照できないクエリ

型安全なクエリビルダーは、テーブルに存在しないカラム名をコンパイル時に拒否します。カラムは生の文字列ではなく、型付けされたオブジェクトを通じて参照します。

型付きカラム参照

テーブルを定義すると、各カラムはテーブルオブジェクトのプロパティになります。フィルターやselectには、文字列ではなくこれらのプロパティを渡します。

import { eq } from "drizzle-orm";

// users.id and users.name are typed column objects
const rows = await db
  .select()
  .from(users)
  .where(eq(users.id, 1));

未知のカラムはコンパイルエラー

カラムは実際のプロパティであるため、タイプミスはすぐに検出されます。文字列に依存する抜け道はありません。

await db.select().from(users).where(eq(users.idd, 1));
//                                          ^^^^ 
// Error: Property "idd" does not exist on the users table.

型付き比較オペランド

eq のような演算子は、カラムの型に対してジェネリックです。数値カラムと文字列を比較すると、型エラーになります。

eq(users.age, 30);       // ok: age is number
eq(users.age, "thirty"); // Error: string is not assignable to number

特定のカラムの選択

値がカラム参照であるオブジェクトを渡すと、必要なカラムだけを射影できます。選択したキーが、そのまま結果のキーになります。

const partial = await db
  .select({ id: users.id, name: users.name })
  .from(users);
// result rows: { id: number; name: string }[]

他のテーブルのカラムを拒否する

selectマップで指定できるのは、クエリ対象のテーブル(複数可)に属するカラムだけです。関係のないテーブルのカラムを参照すると、コンパイルに失敗します。

await db
  .select({ title: posts.title }) // posts not in this query
  .from(users);
// Error: posts.title is not part of the FROM clause.

組み合わせ可能な条件

条件は and、or、not で組み合わせられます。各要素の型情報は維持されるため、条件ツリーの深い場所にある不正な条件も検出されます。

import { and, gt, eq } from "drizzle-orm";

const q = db.select().from(users).where(
  and(gt(users.age, 18), eq(users.isAdmin, false))
);

並べ替えと制限

orderBy も型付きカラム参照を受け取るため、テーブルに存在しないカラムで並べ替えることはできません。

import { desc } from "drizzle-orm";

await db.select().from(users).orderBy(desc(users.age)).limit(10);

拒否の仕組み

ビルダーはテーブル型に対してジェネリックです。where と select のシグネチャは Column<TTable> 型の値だけを受け取るため、コンパイラーはそれ以外を構造的に拒否します。

// Conceptual signature
declare function select<T>(
  table: T,
  cols: { [k: string]: ColumnOf<T> }
): Query;

INSERTも型安全

insertする値もinsertモデルに照らして検査されます。必須フィールドの不足や値の型違いは、SQLが実行される前にコンパイルエラーになります。

await db.insert(users).values({
  name: "Ada",
  isAdmin: false,
  // missing fields would error; extra unknown keys error too
});

役立つ理由

ORMのバグの多くは、名前を変更したカラムや型を間違えたカラムが実行時に初めて発見されることで起こります。型安全なビルダーなら、それらをデプロイよりずっと前にエディター上の赤い波線として示せます。

理解度チェック

型安全なクエリ構築について、理解度を確認しましょう。

まとめ

型安全なクエリ構築では、文字列の代わりに型付きカラム参照を使用します。未知のカラム、オペランドの型違い、FROM句に含まれないテーブルのカラムは、すべてコンパイルエラーになります。ビルダーはテーブルに対してジェネリックであるため、型システムが構造的に妥当性を保証します。

よくある質問

「型安全なクエリ構築」レッスンは無料ですか?

はい。「型安全なクエリ構築」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、TypeScript Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 TypeScript Academyコースには全4レッスンが含まれています。

「型安全なクエリ構築」で何を学びますか?

コンパイル時に無効なカラムを拒否するクエリを構築します。 ブラウザで直接実行するハンズオンコードでTypeScript Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

TypeScript Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのTypeScript Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「型安全なクエリ構築」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このTypeScript Academyレッスンでコードを書いて実行できますか?

はい。すべてのTypeScript Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. スキーマから型へのマッピング
  2. 型安全なクエリ構築
  3. クエリ結果の形状推論
  4. 型によるリレーションとJOIN
← TypeScript Academyに戻る