Skip to main content

Using Custom Schemas

还没翻译译自英文(supabase.com)本页 13 段都还没译

By default, your database has a public schema which is automatically exposed on data APIs.

Creating custom schemas

You can create your own custom schema/s by running the following SQL, substituting myschema with the name you want to use for your schema:

CREATE SCHEMA myschema;

Exposing custom schemas

You can expose custom database schemas - to do so you need to follow these steps:

  1. Go to API settings and add your custom schema to "Exposed schemas".
  2. Run the following SQL, substituting myschema with your schema name:
GRANT USAGE ON SCHEMA myschema TO anon, authenticated, service_role;
GRANT ALL ON ALL TABLES IN SCHEMA myschema TO anon, authenticated, service_role;
GRANT ALL ON ALL ROUTINES IN SCHEMA myschema TO anon, authenticated, service_role;
GRANT ALL ON ALL SEQUENCES IN SCHEMA myschema TO anon, authenticated, service_role;
ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA myschema GRANT ALL ON TABLES TO anon, authenticated, service_role;
ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA myschema GRANT ALL ON ROUTINES TO anon, authenticated, service_role;
ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA myschema GRANT ALL ON SEQUENCES TO anon, authenticated, service_role;

Now you can access these schemas from data APIs:

JavaScriptDartC#cURL

// Initialize the JS client
import { createClient } from '@supabase/supabase-js'

const supabase = createClient(SUPABASE_URL, SUPABASE_PUBLISHABLE_KEY, {
  db: { schema: 'myschema' },
})

// Make a request
const { data: todos, error } = await supabase.from('todos').select('*')

// You can also change the target schema on a per-query basis
const { data: todos, error } = await supabase.schema('myschema').from('todos').select('*')

Note

With generated Database types that include public, createClient<Database>(...) type-checks db.schema against public only, unless the schema name is also passed as the second generic: createClient<Database, 'myschema'>(...). supabase.schema('myschema').from(...) infers its schema per call and needs no second generic. In both cases myschema has to be present in the generated Database type.