メインコンテンツまでスキップ

データベース

すべてのSupabaseプロジェクトには、世界で最も安定した高度なデータベースの1つと考えられている、フリーでオープンソースのPostgresデータベースが搭載されています。

PostgresかPostgreSQLか

Postgresデータベースは、1986年にカリフォルニア大学バークレー校で作成されたパッケージ「POSTGRES Project」から派生したものです。 このパッケージには「PostQUEL」と呼ばれる問い合わせ言語が含まれていました。

1994年にPOSTGRESのコードを元にPostQUELの代わりにSQL言語のインタープリタを追加したPostgres95が作られました。 最終的にPostgres95はSQLクエリ機能を反映してPostgreSQLに改名されました。

その後、多くの人がPostgresと呼ぶようになったのは、混乱を避けるためです。 Supabaseはシンプルであることを重視しているので、Postgresと表記しています。

機能

テーブル・ビュー

Supabaseは、データベースの専門家でなくても使い始めることができます。Supabaseのテーブル・ビューは、Postgresを表計算ソフトのように簡単な操作で使えます。

テーブル・ビュー

関連

データ同士の関連を掘り下げます。

テーブルの複製

表計算ソフトのように、テーブルを複製できます。

SQLエディター

Supabaseには、SQLエディターが付属しています。お気に入りのクエリを保存して、後で実行できます。

その他の機能

  • Supabaseは、私たちのRealtimeを使用して、Postgresにリアルタイム機能を拡張しています。
  • すべてのプロジェクトは完全なPostgresデータベースであり、postgresレベルのアクセス権を持っています。
  • 管理されたバックアップ:データベースのバックアップはすべてSupabaseが行います。backups
  • データのインポート:CSVやExcelのスプレッドシートから直接インポートできます。

backupsStorage APIを介して保存されたオブジェクトは、データーベースにはオブジェクトのメタデータしか保存されないため、バックアップには含まれません。古いバックアップを復元しても、それ以降に削除されたオブジェクトは復元されません。

拡張機能

Postgresデータベースの機能を拡張するために、拡張機能を使用できます。 Supabaseのダッシュボード内のボタンをクリックすることで、Postgresの拡張機能を有効にできます。

Supabaseで提供されているすべての拡張機能については、こちらを参照してください。

Tips

リアルタイム

SupabaseはPostgresの上にリアルタイムエンジンを提供しており、変更が発生したときにそれをリッスンできます。 Supabaseのリアルタイム・エンジンは、Postgresに組み込まれたレプリケーション機能を利用しています。

Realtime Serverは、行単位セキュリティー(RLS)ポリシーに応じて、データベースの変更を許可されたユーザーにブロードキャストします。 パブリケーションに追加するテーブルでは、行単位セキュリティーを有効にして行セキュリティーポリシーを設定することをお勧めします。 ただし、テーブルでRLSを無効にして、接続しているすべてのクライアントに変更をブロードキャストもできます。

リアルタイム・システムを管理するには簡単です。supabase_realtimeパブリケーションを更新するだけです。

例えば、次のように個別のテーブルのみリアルタイム性を持たせることができます。

begin;
-- リアルタイム・パブリケーションを削除
drop publication if exists supabase_realtime;

-- パブリケーションを再作成しますが、どのテーブルに対しても有効にしません
create publication supabase_realtime;
commit;

-- テーブルにパブリケーションを追加
alter publication supabase_realtime add table products;

-- 他のテーブルにパブリケーションを追加
alter publication supabase_realtime add table posts;

デフォルトでは「新しい」値のみが送信されます。レコードをupdatedeleteしたときに、古いレコード(以前の値)も受信できます。その場合は、テーブルのレプリカIDを更新してfullに設定します。

alter table your_table replica identity full;

プロジェクト間の移行

プロジェクトの移行は、PostgreSQLの標準的なツールを使って行うことができます。これは特に古いプロジェクト(例えば、より新しいPostgresバージョンを使用したいとき)に有効です。

はじめる前に

  • Postgresがインストールされていて、psqlpg_dumpが実行できることを確認してください。
  • 新しいSupabaseプロジェクトを作成します。
  • 古いプロジェクトでDatabase Webhooksを有効にしていた場合は、新しいプロジェクトでも有効にしてください。
  • 古いプロジェクトのデータベースのURLを$OLD_DB_URLに、新しいプロジェクトのものを$NEW_DB_URLに格納します。

データベースの移行

  1. 古いプロジェクトのSQLエディターで、ALTER ROLE postgres SUPERUSERを実行します。
  2. ターミナルでpg_dump --clean --if-exists --quote-all-identifiers -h $OLD_DB_URL -U postgres > dump.sqlを実行します。
  3. 古いプロジェクトのSQLエディターで、ALTER ROLE postgres NOSUPERUSERを実行します。
  4. 新しいプロジェクトのSQLエディターで、ALTER ROLE postgres SUPERUSERを実行します。
  5. ターミナルでpsql -h $NEW_DB_URL -U postgre -f dump.sqlを実行します。
  6. 新しいプロジェクトのSQLエディターで、TRUNCATE storage.objectsを実行します。
  7. 新しいプロジェクトのSQLエディターで、ALTER ROLE postgres NOSUPERUSERを実行します。

ストレージのオブジェクトを移行

このスクリプトは、ストレージのオブジェクトをあるプロジェクトから別のプロジェクトに移動させます。1万以上のオブジェクトがある場合は、オブジェクトの移動を代行します。support@supabase.ioまでご連絡ください。

const { createClient } = require('@supabase/supabase-js')

const OLD_PROJECT_URL = 'https://xxx.supabase.co'
const OLD_PROJECT_SERVICE_KEY = 'old-project-service-key-xxx'

const NEW_PROJECT_URL = 'https://yyy.supabase.co'
const NEW_PROJECT_SERVICE_KEY = 'new-project-service-key-yyy'

;(async () => {
const oldSupabaseRestClient = createClient(OLD_PROJECT_URL, OLD_PROJECT_SERVICE_KEY, {
schema: 'storage',
})
const oldSupabaseClient = createClient(OLD_PROJECT_URL, OLD_PROJECT_SERVICE_KEY)
const newSupabaseClient = createClient(NEW_PROJECT_URL, NEW_PROJECT_SERVICE_KEY)

// make sure you update max_rows in postgrest settings if you have a lot of objects
// or paginate here
const { data: oldObjects, error } = await oldSupabaseRestClient.from('objects').select()
if (error) {
console.log('error getting objects from old bucket')
throw error
}

for (const objectData of oldObjects) {
console.log(`moving ${objectData.id}`)
try {
const { data, error: downloadObjectError } = await oldSupabaseClient.storage
.from(objectData.bucket_id)
.download(objectData.name)
if (downloadObjectError) {
throw downloadObjectError
}

const { _, error: uploadObjectError } = await newSupabaseClient.storage
.from(objectData.bucket_id)
.upload(objectData.name, data, {
upsert: true,
contentType: objectData.metadata.mimetype,
cacheControl: objectData.metadata.cacheControl,
})
if (uploadObjectError) {
throw uploadObjectError
}
} catch (err) {
console.log('error moving ', objectData)
console.log(err)
}
}
})()

注意点

  • 新しいプロジェクトには、古いプロジェクトのStorageバケットはありますが、オブジェクトはありません。Storageオブジェクトを手動で移行する必要があります。

プロジェクトのパスワードをリセット

Supabaseで新規プロジェクトを作成する際に、パスワードの入力を求められます。このパスワードを使って、Postgresデータベースに直接接続できます。

パスワードを忘れてしまった場合は、ダッシュボードのデータベース設定ページでパスワードを再設定できます。

詳しくはデータベースの設定をご覧ください。

サーバーのタイムゾーンを変更

データベースはUTCタイムゾーンで初期化されます。時刻の計算に便利なので、このままにしておくことをお勧めします。しかし、タイムゾーンを更新したい場合は、データベースのタイムゾーンのいずれかを使って更新できます。

以下のように実行します。

alter database postgres set timezone to 'America/New_York';

詳しくはデータベースの設定をご覧ください。

次のステップ