🐘

drizzle-kit push と PgVector の共存問題を解決する

に公開

📌 TL;DR

  • drizzle-kit push が他ツール(PgVector等)のシーケンスを削除しようとしてエラーになる
  • tablesFilter ではシーケンスはフィルタされない
  • PostgreSQLスキーマ分離 + schemaFilter で解決

背景

Mastra(AIエージェントフレームワーク)を使って PgVector でベクトル検索をしつつ、マスタデータは Drizzle ORM で管理したいケースで問題が発生しました。

ツール 用途
PgVector (Mastra) ベクトル検索
Drizzle ORM マスタデータ管理

なぜ両方使うのか

  • PgVector: Mastraが内部でテーブル・シーケンスを自動管理。専用APIでベクトル操作
  • Drizzle: 型安全なCRUD、宣言的スキーマ管理

すべてDrizzleに統一する選択肢もありますが、Mastraとの統合が複雑になるため共存を選択しました。

問題

drizzle-kit push 実行時にエラー:

error: cannot drop sequence user_id_seq because other objects depend on it

原因

  • 両ツールが public スキーマを共有
  • drizzle-kit が「知らないシーケンス」を削除しようとする
  • tablesFilter はテーブルのみフィルタ、シーケンスは対象外

これは 既知のIssue のようです。(Resolved後も報告がちらほら)

解決策

PostgreSQLスキーマで名前空間を分離します。

db
├── public スキーマ (PgVector)
│   ├── documents
│   └── embeddings
└── drizzle スキーマ (Drizzle)
    └── settings

実装

drizzle.config.ts

  schemaFilter: ['drizzle'], // drizzleスキーマのみ対象

Schema

import { pgSchema } from 'drizzle-orm/pg-core';

export const drizzleSchema = pgSchema('drizzle');
export const settings = drizzleSchema.table('settings', { ... });

動作確認

# DB再構築
docker-compose down -v && docker-compose up -d

# スキーマ+テーブル作成(自動でdrizzleスキーマも作成される)
npx drizzle-kit push

# シード実行
npx tsx src/scripts/seed-*.ts

✅ Changes applied

エラーなく完了しました。

まとめ

設定 対象 シーケンス
tablesFilter テーブル名 フィルタされない
schemaFilter PostgreSQLスキーマ フィルタされる

複数ツールがDBを共有する場合、PostgreSQLスキーマで分離するのが有効そうです。

参考

Discussion