すべての記事
PostgreSQL 基礎講座 #8 ビュー・CTE・ウィンドウ関数 — 複雑なクエリを読みやすくする
大きくなったクエリを構造化する 3 つの道具を固めます。繰り返されるクエリに名前を付けるビューと物理コピーであるマテリアライズドビューの区別、WITH 句(CTE)でクエリを段階ごとに記述する方法、ウィンドウ関数の基本構造(OVER、PARTITION BY)と ROW_NUMBER でグループごとの上位 N 件を取る代表パターン、集計関数とウィンドウ関数の違い(行が減らない)、LAG で前月比を求める例まで扱います。
Rust 基礎講座 #8 トレイトとジェネリクス — 継承がない言語で共通の動作を定義する
これまで先送りしてきた概念を回収する回です。共通の動作を定義するトレイト(trait)と既定実装、型を一般化するジェネリクスとトレイト境界、derive が自動生成する標準トレイト(Debug・Clone・Copy・PartialEq)、ジェネリクスがランタイムコストなしにコンパイルされる単相化、そして Box<dyn Error> の dyn が意味する動的ディスパッチまで扱います。
SQLAlchemy 2.0 #7 Alembic と実戦構成 — マイグレーション、非同期、チーム規約
シリーズ最終回として運用フェーズのテーマを整理します。create_all がスキーマ変更を解決できない理由と Alembic の導入、autogenerate が検知できるものと見落とすもの、マイグレーションファイルのレビュー原則、create_async_engine と AsyncSession に移行する非同期構成と遅延ロードの制約、モデル・セッション・設定を配置するプロジェクト構造、チームで守る規約まで扱います。
PostgreSQL 基礎講座 #7 JSONB — スキーマの柔軟さをリレーショナルの中で
PostgreSQL が NoSQL の領域まで担えるようになった立役者、JSONB を固めます。json と jsonb の違い(jsonb が既定値である理由)、値の取り出し演算子(->、->>、#>>)と存在・包含演算子(?、@>)の使い方、JSONB 検索を支える GIN インデックス、更新(jsonb_set)の特性、そして一番重要な「どこまでをカラムにして、どこからを JSONB に入れるか」の設計境界まで扱います。
Rust 基礎講座 #7 コレクションとイテレータ — Vec・String・HashMap、for の代わりにチェーン
実務コードの本体である 3 つのコレクションを扱います。可変長リストの Vec とインデックスの代わりに get を使う理由、なぜ String はインデックスでアクセスできないのか(UTF-8 とバイト・文字の違い)、HashMap と entry API、そして for 文を map・filter・collect のチェーンに置き換えるイテレータスタイルと遅延評価まで扱います。
SQLAlchemy 2.0 #6 クエリ応用 — 結合、集計、サブクエリ、大量処理
select() ひとつで実戦的なクエリを組み立てる方法を整理します。scalars と execute の戻り値の形の違い、複数条件と or_、結合と明示的な ON 句、group_by と集計関数にラベルを付けて読む方法、サブクエリと EXISTS、LIMIT・OFFSET ページネーションとその限界、ORM の単位作業を迂回する大量 INSERT・UPDATE まで、2.0 スタイルのクエリの実務レパートリーを扱います。
PostgreSQL 基礎講座 #6 トランザクションと MVCC — 同時実行の基本原理
複数の接続が同じデータを同時に触るとき、PostgreSQL が一貫性を守る仕組みを固めます。BEGIN・COMMIT・ROLLBACK の基本と原子性、MVCC(多版型同時実行制御)の核心である「読み取りは書き込みを妨げない」、UPDATE が実際には新しいバージョンの行を作るという事実と dead tuple の予告、既定の分離レベル Read Committed の意味と罠、Repeatable Read・Serializable に上げる場合まで扱います。
Rust 基礎講座 #6 エラー処理 — Result と ? 演算子、panic と unwrap の境界
例外(exception)のない Rust のエラー処理を扱います。失敗の可能性を戻り値の型に現す Result、match の入れ子を 1 文字に縮めてエラーを伝播する ? 演算子、main が Result を返す実用形、そして unwrap・expect・panic をいつ使ってよく、いつ使ってはいけないのかの判断基準まで扱います。
SQLAlchemy 2.0 #5 リレーション — 1:N、N:M、そして N+1 問題
ORM の花形であり罠でもある relationship を整理します。外部キーと relationship の役割分担、back_populates で双方向をつなぐ 1:N の宣言、secondary テーブルを使う N:M、親削除時の子の扱いを決める cascade と delete-orphan、遅延ロードが生む N+1 問題を echo ログで確認する方法、selectinload と joinedload で解決する基準まで扱います。
PostgreSQL 基礎講座 #5 EXPLAIN の読み方 — 実行計画でクエリを診断する
クエリが遅い理由を推測ではなく実行計画で確かめる方法を固めます。EXPLAIN と EXPLAIN ANALYZE の違い(後者は実際に実行)、計画ツリーを内側から読む順序、Seq Scan・Index Scan・Index Only Scan・Bitmap Scan の意味、cost と actual time・rows の見積もりと実測の比較、見積もりが大きく外れたときの処方(ANALYZE)、そして BUFFERS で読み取り量を見る習慣まで扱います。
Rust 基礎講座 #5 構造体と列挙型 — match と Option、null がない言語の設計
データを構造化する 2 本の軸、構造体(struct)と列挙型(enum)を扱います。impl ブロックでメソッドを付ける方法、バリアントごとに異なるデータを持てる Rust 列挙型の表現力、すべてのケースを検査したかをコンパイラが強制する match、そして null の代わりに「値がないかもしれない」を型で表す Option まで、Rust コードの骨格になる道具を扱います。
SQLAlchemy 2.0 #4 セッション — 変更追跡、flush と commit、オブジェクトの 4 つの状態
ORM の心臓部である Session を整理します。セッションが単位作業(Unit of Work)として変更をため込み、まとめて SQL として送り出す仕組み、flush と commit の違い、transient・pending・persistent・detached というオブジェクトの 4 状態、同じ行には同じオブジェクトを返す identity map、commit 後の属性アクセスが再クエリを発行する理由、Web アプリケーションではリクエストごとにセッション 1 つというスコープ原則まで扱います。