VercelとNeonを連携してPostgreSQL 18を使いたかったら、Neon側でプロジェクトを作成する必要がある
はじめに
個人開発中の「4h Budget」で、DrizzleのスキーマにUUIDv7をデフォルト値として使うテーブルを定義しました。
export const users = pgTable("users", {
id: uuid('id').primaryKey().default(sql`uuidv7()`),
// ...省略
})
uuidv7() はPostgreSQL 18で標準搭載された関数です。
Neonは公式で18をサポートしており、以前別の開発(Vercelは未使用)でNeonを使った際は18で作成されていたので、VercelからでNeonのデータベースを作成した今回も、当然18になっているだろうと思い込んで drizzle-kit push を実行したところ、いきなりエラーが出ました。
query error: function uuidv7() does not exist
「あれ、おかしいな」と思って調べてみたら、Vercel経由でNeonのDBを作った場合とNeonのダッシュボードから直接作った場合とで、選べるPostgreSQLのバージョンが違うということに気づいたので、その内容をまとめておきます。
Neon上のSQL Editorでバージョンを確認する
まずは実際に動いているPostgreSQLのバージョンを確認してみます。Neonのダッシュボード内のSQL Editorで以下を実行しました。
select * From version();
PostgreSQL 17.10 (2947584) on aarch64-unknown-linux-gnu, compiled by gcc (Debian 12.2.0-14+deb12u1) 12.2.0, 64-bit
17.10でした。「NeonはPostgreSQL 18をサポートしているはずなのに、なんで新規作成したプロジェクトが17なんだ?」というのが最初の疑問でした。
VercelのダッシュボードからNeonのDBを作成すると、バージョンを選べない
原因は、DBを作成した経路にありました。Vercelのダッシュボード経由でNeonのIntegrationからデータベースを作成すると、バージョン選択のUIが出てきません。
挙動を見た感じ、Vercel経由で作る場合はPostgreSQLのバージョンが17に固定されているようです。
一方で、Neon自体のダッシュボードから直接プロジェクトを作成すると、14〜18まで自由にバージョンを選択できます。
解決策:Neon側でプロジェクトを作り直す
Neonは作成済みプロジェクトのメジャーバージョンアップグレードには対応していません。なので、バージョンを後から17→18に上げる、ということはできませんでした。
対応としては、一旦プロジェクトを削除して、Neonのダッシュボードから新規にPostgreSQL 18を選んでプロジェクトを作り直すことで解決しました。
まとめ・感想
- VercelのIntegration経由でNeonのDBを作成すると、PostgreSQLのバージョンは17固定になり、バージョンを選ぶUIが出てこない
- Neonのダッシュボードから直接プロジェクトを作成すると、14〜18の中からバージョンを選べる
- Neonは作成済みプロジェクトのメジャーバージョンアップグレードに対応していないため、バージョンを変えたい場合はプロジェクトの作り直しが必要
-
uuidv7()のようなPostgreSQL 18固有の関数を使う予定がある場合は、DB作成前に「どの経路で作るか」を意識しておいたほうがいい - 今回はスキーマの一番最初のpushで気づけたのでまだ良かったが、開発が進んだ後やリリース後に気づいていたら、プロジェクトの作り直し=データの作り直しになりかねず、かなりヒヤッとした