#データベース
29 件の記事
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 に上げる場合まで扱います。
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 で読み取り量を見る習慣まで扱います。
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 つというスコープ原則まで扱います。
PostgreSQL 基礎講座 #4 インデックス基礎 — いつ効いて、いつ効かないのか
読み取りを速くする基本手段であるインデックスを、PostgreSQL 基準で固めます。B-tree インデックスが検索を変える構造、作ったのに使われない代表的な原因(先頭カラムの不一致、カラムへの関数適用、型の不一致、低い選択度)、書き込み性能とストレージというコスト、そして「遅いクエリの WHERE・JOIN・ORDER BY を見て作る」という実務の順序まで扱います。
SQLAlchemy 2.0 #3 ORM モデル定義 — DeclarativeBase、Mapped、mapped_column
テーブルを Python クラスとして宣言する 2.0 スタイルの ORM モデル定義を整理します。DeclarativeBase を継承する構造、Mapped 型ヒントと mapped_column の役割分担、Python の型が DB の型にマッピングされるルール、Optional と nullable の連動、デフォルト値・ユニーク制約・インデックスの宣言、制約名を自動で付ける命名規約まで扱います。
PostgreSQL 基礎講座 #3 結合と集計 — 読み取りクエリの実務感覚
読み取りクエリの実務の 8 割を占める結合と集計を固めます。INNER と LEFT 結合の選択基準と、LEFT 結合の結果を WHERE で絞って INNER にしてしまう古典的なミス、GROUP BY と HAVING の役割分担、集計と結合が混ざるときの重複集計の罠、サブクエリと結合の分かれ道、そしてグループごとの最新 1 件を取る PostgreSQL らしい方法(DISTINCT ON)まで扱います。
SQLAlchemy 2.0 #2 エンジンとトランザクション — コネクションプールと commit の 2 パターン
SQLAlchemy の土台であるエンジンとトランザクションを整理します。コネクションプールがなぜ必要でどう動くのか、pool_size と max_overflow が実際に制限しているもの、connect() と begin() で分かれる commit-as-you-go と begin-once のパターン、トランザクションが自動コミットされない理由、MetaData と Table でテーブルを定義し Core の式で CRUD を実行するところまで扱います。
PostgreSQL 基礎講座 #2 データ型とテーブル設計 — 何として保存するか
PostgreSQL 設計の半分はデータ型の選択です。文字列は text 1 つで足りる理由、お金の計算に numeric が必須の理由、時刻保存の標準である timestamptz と timestamp の罠、主キー戦略(bigint IDENTITY vs UUID、そして uuidv7)、NOT NULL・CHECK・外部キーでデータ整合性を DB 層で守る設計、enum と配列を使う場所まで扱います。
SQLAlchemy 2.0 #1 全体像 — Core と ORM、そして 2.0 スタイル
Python の DB ライブラリの事実上の標準である SQLAlchemy を基礎から整理するシリーズの第 1 回です。Core と ORM という 2 層の構造、1.x 時代のコードと 2.0 スタイルが違う理由、select() を中心に統一されたクエリの書き方と型ヒント対応、インストールと最初の接続、text() で SQL を直接実行するところまで扱います。
PostgreSQL 基礎講座 #1 PostgreSQL とは — 既定の DB になった理由、インストールと psql の最初の一歩
PostgreSQL が新規プロジェクトの既定データベースになった背景から始めます。標準準拠と豊富なデータ型、拡張エコシステム(pgvector・PostGIS)、寛容なライセンスという選ばれる理由、Docker でローカルに立てる最速のインストール、psql への接続とメタコマンド(\l、\dt、\d)の基本、最初のテーブルを作って入れて読む 1 サイクル、そして講座全体の地図まで扱います。