🐘
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