Generate Multiple BaseModels for Multiple Schemas¶
This example demonstrates how to generate multiple BaseModel files corresponding to multiple database schemas. The --all-schemas
option with supabase-pydantic
allows the generation of BaseModel files for all schemas that are not empty. Additionally, the --schema
option can be used to specify a specific schema to generate a BaseModel file for. The default behavior is to generate a BaseModel file for the public
schema if neither of these option is provided. This feature is useful when you want to create Pydantic models for schemas other than public
in your database.
Please note ...
This is a developing feature . It is imperfect, so please report any issues you encounter.
Prerequisites¶
Ensure that you have followed the setup & prerequisites guide in the Slack Clone example to initialize your local Supabase instance.
Generating BaseModels for a Specific Schema¶
To generate a BaseModel file for a specific schema, use one or more --schema
options with the generate
command. For example, run the following command:
$ sb-pydantic gen --type pydantic --framework fastapi --local --schema public --schema auth --schema extensions
PostGres connection is open.
Processing schema: public
Processing schema: auth
Processing schema: extensions
PostGres connection is closed.
Generating Pydantic models...
Pydantic models generated successfully for schema 'auth': /path/to/your/project/entities/fastapi/schema_auth_latest.py
Generating Pydantic models...
Pydantic models generated successfully for schema 'extensions': /path/to/your/project/entities/fastapi/schema_extensions_latest.py
Generating Pydantic models...
Pydantic models generated successfully for schema 'public': /path/to/your/project/entities/fastapi/schema_public_latest.py
File formatted successfully: /path/to/your/project/entities/fastapi/schema_auth_latest.py
File formatted successfully: /path/to/your/project/entities/fastapi/schema_extensions_latest.py
File formatted successfully: /path/to/your/project/entities/fastapi/schema_public_latest.py
An example of the generated BaseModel file for the auth
schema can be found here:
schema_auth_latest.py
from __future__ import annotations
import datetime
from ipaddress import IPv4Address, IPv6Address
from pydantic import UUID4, BaseModel, Field, Json
# CUSTOM CLASSES
# Note: This is a custom model class for defining common features among
# Pydantic Base Schema.
class CustomModel(BaseModel):
pass
# BASE CLASSES
class AuditLogEntriesBaseSchema(CustomModel):
"""AuditLogEntries Base Schema."""
# Primary Keys
id: UUID4
# Columns
created_at: datetime.datetime | None = Field(default=None)
instance_id: UUID4 | None = Field(default=None)
ip_address: str
payload: dict | Json | None = Field(default=None)
class FlowStateBaseSchema(CustomModel):
"""FlowState Base Schema."""
# Primary Keys
id: UUID4
# Columns
auth_code: str
auth_code_issued_at: datetime.datetime | None = Field(default=None)
authentication_method: str
code_challenge: str
code_challenge_method: str
created_at: datetime.datetime | None = Field(default=None)
provider_access_token: str | None = Field(default=None)
provider_refresh_token: str | None = Field(default=None)
provider_type: str
updated_at: datetime.datetime | None = Field(default=None)
user_id: UUID4 | None = Field(default=None)
class IdentitiesBaseSchema(CustomModel):
"""Identities Base Schema."""
# Primary Keys
id: UUID4
# Columns
created_at: datetime.datetime | None = Field(default=None)
email: str | None = Field(default=None)
identity_data: dict | Json
last_sign_in_at: datetime.datetime | None = Field(default=None)
provider: str
provider_id: str
updated_at: datetime.datetime | None = Field(default=None)
user_id: UUID4
class InstancesBaseSchema(CustomModel):
"""Instances Base Schema."""
# Primary Keys
id: UUID4
# Columns
created_at: datetime.datetime | None = Field(default=None)
raw_base_config: str | None = Field(default=None)
updated_at: datetime.datetime | None = Field(default=None)
uuid: UUID4 | None = Field(default=None)
class MfaAmrClaimsBaseSchema(CustomModel):
"""MfaAmrClaims Base Schema."""
# Primary Keys
id: UUID4
# Columns
authentication_method: str
created_at: datetime.datetime
session_id: UUID4
updated_at: datetime.datetime
class MfaChallengesBaseSchema(CustomModel):
"""MfaChallenges Base Schema."""
# Primary Keys
id: UUID4
# Columns
created_at: datetime.datetime
factor_id: UUID4
ip_address: IPv4Address | IPv6Address
otp_code: str | None = Field(default=None)
verified_at: datetime.datetime | None = Field(default=None)
class MfaFactorsBaseSchema(CustomModel):
"""MfaFactors Base Schema."""
# Primary Keys
id: UUID4
# Columns
created_at: datetime.datetime
factor_type: str
friendly_name: str | None = Field(default=None)
last_challenged_at: datetime.datetime | None = Field(default=None)
phone: str | None = Field(default=None)
secret: str | None = Field(default=None)
status: str
updated_at: datetime.datetime
user_id: UUID4
class OneTimeTokensBaseSchema(CustomModel):
"""OneTimeTokens Base Schema."""
# Primary Keys
id: UUID4
# Columns
created_at: datetime.datetime
relates_to: str
token_hash: str
token_type: str
updated_at: datetime.datetime
user_id: UUID4
class RefreshTokensBaseSchema(CustomModel):
"""RefreshTokens Base Schema."""
# Primary Keys
id: int
# Columns
created_at: datetime.datetime | None = Field(default=None)
instance_id: UUID4 | None = Field(default=None)
parent: str | None = Field(default=None)
revoked: bool | None = Field(default=None)
session_id: UUID4 | None = Field(default=None)
token: str | None = Field(default=None)
updated_at: datetime.datetime | None = Field(default=None)
user_id: str | None = Field(default=None)
class SamlProvidersBaseSchema(CustomModel):
"""SamlProviders Base Schema."""
# Primary Keys
id: UUID4
# Columns
attribute_mapping: dict | Json | None = Field(default=None)
created_at: datetime.datetime | None = Field(default=None)
entity_id: str
metadata_url: str | None = Field(default=None)
metadata_xml: str
name_id_format: str | None = Field(default=None)
sso_provider_id: UUID4
updated_at: datetime.datetime | None = Field(default=None)
class SamlRelayStatesBaseSchema(CustomModel):
"""SamlRelayStates Base Schema."""
# Primary Keys
id: UUID4
# Columns
created_at: datetime.datetime | None = Field(default=None)
flow_state_id: UUID4 | None = Field(default=None)
for_email: str | None = Field(default=None)
redirect_to: str | None = Field(default=None)
request_id: str
sso_provider_id: UUID4
updated_at: datetime.datetime | None = Field(default=None)
class SchemaMigrationsBaseSchema(CustomModel):
"""SchemaMigrations Base Schema."""
# Primary Keys
version: str
class SessionsBaseSchema(CustomModel):
"""Sessions Base Schema."""
# Primary Keys
id: UUID4
# Columns
aal: str | None = Field(default=None)
created_at: datetime.datetime | None = Field(default=None)
factor_id: UUID4 | None = Field(default=None)
ip: IPv4Address | IPv6Address | None = Field(default=None)
not_after: datetime.datetime | None = Field(default=None)
refreshed_at: datetime.datetime | None = Field(default=None)
tag: str | None = Field(default=None)
updated_at: datetime.datetime | None = Field(default=None)
user_agent: str | None = Field(default=None)
user_id: UUID4
class SsoDomainsBaseSchema(CustomModel):
"""SsoDomains Base Schema."""
# Primary Keys
id: UUID4
# Columns
created_at: datetime.datetime | None = Field(default=None)
domain: str
sso_provider_id: UUID4
updated_at: datetime.datetime | None = Field(default=None)
class SsoProvidersBaseSchema(CustomModel):
"""SsoProviders Base Schema."""
# Primary Keys
id: UUID4
# Columns
created_at: datetime.datetime | None = Field(default=None)
resource_id: str | None = Field(default=None)
updated_at: datetime.datetime | None = Field(default=None)
class UsersBaseSchema(CustomModel):
"""Users Base Schema."""
# Primary Keys
id: UUID4
# Columns
aud: str | None = Field(default=None)
banned_until: datetime.datetime | None = Field(default=None)
confirmation_sent_at: datetime.datetime | None = Field(default=None)
confirmation_token: str | None = Field(default=None)
confirmed_at: datetime.datetime | None = Field(default=None)
created_at: datetime.datetime | None = Field(default=None)
deleted_at: datetime.datetime | None = Field(default=None)
email: str | None = Field(default=None)
email_change: str | None = Field(default=None)
email_change_confirm_status: int | None = Field(default=None)
email_change_sent_at: datetime.datetime | None = Field(default=None)
email_change_token_current: str | None = Field(default=None)
email_change_token_new: str | None = Field(default=None)
email_confirmed_at: datetime.datetime | None = Field(default=None)
encrypted_password: str | None = Field(default=None)
instance_id: UUID4 | None = Field(default=None)
invited_at: datetime.datetime | None = Field(default=None)
is_anonymous: bool
is_sso_user: bool
is_super_admin: bool | None = Field(default=None)
last_sign_in_at: datetime.datetime | None = Field(default=None)
phone: str | None = Field(default=None)
phone_change: str | None = Field(default=None)
phone_change_sent_at: datetime.datetime | None = Field(default=None)
phone_change_token: str | None = Field(default=None)
phone_confirmed_at: datetime.datetime | None = Field(default=None)
raw_app_meta_data: dict | Json | None = Field(default=None)
raw_user_meta_data: dict | Json | None = Field(default=None)
reauthentication_sent_at: datetime.datetime | None = Field(default=None)
reauthentication_token: str | None = Field(default=None)
recovery_sent_at: datetime.datetime | None = Field(default=None)
recovery_token: str | None = Field(default=None)
role: str | None = Field(default=None)
updated_at: datetime.datetime | None = Field(default=None)
# OPERATIONAL CLASSES
class AuditLogEntries(AuditLogEntriesBaseSchema):
"""AuditLogEntries Schema for Pydantic.
Inherits from AuditLogEntriesBaseSchema. Add any customization here.
"""
pass
class FlowState(FlowStateBaseSchema):
"""FlowState Schema for Pydantic.
Inherits from FlowStateBaseSchema. Add any customization here.
"""
# Foreign Keys
saml_relay_states: list[SamlRelayStates] | None = Field(default=None)
class Identities(IdentitiesBaseSchema):
"""Identities Schema for Pydantic.
Inherits from IdentitiesBaseSchema. Add any customization here.
"""
# Foreign Keys
users: list[Users] | None = Field(default=None)
class Instances(InstancesBaseSchema):
"""Instances Schema for Pydantic.
Inherits from InstancesBaseSchema. Add any customization here.
"""
pass
class MfaAmrClaims(MfaAmrClaimsBaseSchema):
"""MfaAmrClaims Schema for Pydantic.
Inherits from MfaAmrClaimsBaseSchema. Add any customization here.
"""
# Foreign Keys
sessions: list[Sessions] | None = Field(default=None)
class MfaChallenges(MfaChallengesBaseSchema):
"""MfaChallenges Schema for Pydantic.
Inherits from MfaChallengesBaseSchema. Add any customization here.
"""
# Foreign Keys
mfa_factors: list[MfaFactors] | None = Field(default=None)
class MfaFactors(MfaFactorsBaseSchema):
"""MfaFactors Schema for Pydantic.
Inherits from MfaFactorsBaseSchema. Add any customization here.
"""
# Foreign Keys
users: list[Users] | None = Field(default=None)
mfa_challenges: list[MfaChallenges] | None = Field(default=None)
class OneTimeTokens(OneTimeTokensBaseSchema):
"""OneTimeTokens Schema for Pydantic.
Inherits from OneTimeTokensBaseSchema. Add any customization here.
"""
# Foreign Keys
users: list[Users] | None = Field(default=None)
class RefreshTokens(RefreshTokensBaseSchema):
"""RefreshTokens Schema for Pydantic.
Inherits from RefreshTokensBaseSchema. Add any customization here.
"""
# Foreign Keys
sessions: list[Sessions] | None = Field(default=None)
class SamlProviders(SamlProvidersBaseSchema):
"""SamlProviders Schema for Pydantic.
Inherits from SamlProvidersBaseSchema. Add any customization here.
"""
# Foreign Keys
sso_providers: list[SsoProviders] | None = Field(default=None)
class SamlRelayStates(SamlRelayStatesBaseSchema):
"""SamlRelayStates Schema for Pydantic.
Inherits from SamlRelayStatesBaseSchema. Add any customization here.
"""
# Foreign Keys
flow_state: list[FlowState] | None = Field(default=None)
sso_providers: list[SsoProviders] | None = Field(default=None)
class SchemaMigrations(SchemaMigrationsBaseSchema):
"""SchemaMigrations Schema for Pydantic.
Inherits from SchemaMigrationsBaseSchema. Add any customization here.
"""
pass
class Sessions(SessionsBaseSchema):
"""Sessions Schema for Pydantic.
Inherits from SessionsBaseSchema. Add any customization here.
"""
# Foreign Keys
users: list[Users] | None = Field(default=None)
mfa_amr_claims: list[MfaAmrClaims] | None = Field(default=None)
refresh_tokens: list[RefreshTokens] | None = Field(default=None)
class SsoDomains(SsoDomainsBaseSchema):
"""SsoDomains Schema for Pydantic.
Inherits from SsoDomainsBaseSchema. Add any customization here.
"""
# Foreign Keys
sso_providers: list[SsoProviders] | None = Field(default=None)
class SsoProviders(SsoProvidersBaseSchema):
"""SsoProviders Schema for Pydantic.
Inherits from SsoProvidersBaseSchema. Add any customization here.
"""
# Foreign Keys
saml_providers: list[SamlProviders] | None = Field(default=None)
saml_relay_states: list[SamlRelayStates] | None = Field(default=None)
sso_domains: list[SsoDomains] | None = Field(default=None)
class Users(UsersBaseSchema):
"""Users Schema for Pydantic.
Inherits from UsersBaseSchema. Add any customization here.
"""
# Foreign Keys
identities: list[Identities] | None = Field(default=None)
mfa_factors: list[MfaFactors] | None = Field(default=None)
one_time_tokens: list[OneTimeTokens] | None = Field(default=None)
sessions: list[Sessions] | None = Field(default=None)
Generating BaseModels for All Schemas¶
To generate BaseModel files for all schemas, use the --all-schemas
option with the generate
command. Note, this will take precedence over any --schema
options provided. For example, run the following command:
$ sb-pydantic gen --type pydantic --framework fastapi --local --all-schemas
PostGres connection is open.
Processing schema: public
Processing schema: graphql
Processing schema: graphql_public
Processing schema: vault
Processing schema: pgsodium_masks
Processing schema: pgsodium
Processing schema: auth
Processing schema: storage
Processing schema: realtime
Processing schema: net
Processing schema: supabase_functions
Processing schema: pg_toast_temp_20
Processing schema: pg_temp_20
Processing schema: pg_toast_temp_27
Processing schema: pg_temp_27
Processing schema: pg_toast_temp_19
Processing schema: pg_temp_19
Processing schema: _supavisor
Processing schema: _analytics
Processing schema: _realtime
Processing schema: pg_toast_temp_31
Processing schema: pg_temp_31
Processing schema: pg_toast_temp_30
Processing schema: pg_temp_30
Processing schema: pg_toast_temp_32
Processing schema: pg_temp_32
Processing schema: pg_toast_temp_28
Processing schema: extensions
Processing schema: pg_temp_28
Processing schema: pg_toast_temp_29
Processing schema: pg_temp_29
Processing schema: pg_toast
PostGres connection is closed.
The following schemas have no tables and will be skipped: graphql, graphql_public, pgsodium_masks, pg_toast_temp_20, pg_temp_20, pg_toast_temp_27, pg_temp_27, pg_toast_temp_19, pg_temp_19, _supavisor, _realtime, pg_toast_temp_31, pg_temp_31, pg_toast_temp_30, pg_temp_30, pg_toast_temp_32, pg_temp_32, pg_toast_temp_28, pg_temp_28, pg_toast_temp_29, pg_temp_29, pg_toast
Generating Pydantic models...
Pydantic models generated successfully for schema 'public': /path/to/your/project/entities/fastapi/schema_public_latest.py
Generating Pydantic models...
Pydantic models generated successfully for schema 'vault': /path/to/your/project/entities/fastapi/schema_vault_latest.py
Generating Pydantic models...
Pydantic models generated successfully for schema 'pgsodium': /path/to/your/project/entities/fastapi/schema_pgsodium_latest.py
Generating Pydantic models...
Pydantic models generated successfully for schema 'auth': /path/to/your/project/entities/fastapi/schema_auth_latest.py
Generating Pydantic models...
Pydantic models generated successfully for schema 'storage': /path/to/your/project/entities/fastapi/schema_storage_latest.py
Generating Pydantic models...
Pydantic models generated successfully for schema 'realtime': /path/to/your/project/entities/fastapi/schema_realtime_latest.py
Generating Pydantic models...
Pydantic models generated successfully for schema 'net': /path/to/your/project/entities/fastapi/schema_net_latest.py
Generating Pydantic models...
Pydantic models generated successfully for schema 'supabase_functions': /path/to/your/project/entities/fastapi/schema_supabase_functions_latest.py
Generating Pydantic models...
Pydantic models generated successfully for schema '_analytics': /path/to/your/project/entities/fastapi/schema__analytics_latest.py
Generating Pydantic models...
Pydantic models generated successfully for schema 'extensions': /path/to/your/project/entities/fastapi/schema_extensions_latest.py
File formatted successfully: /path/to/your/project/entities/fastapi/schema_public_latest.py
File formatted successfully: /path/to/your/project/entities/fastapi/schema_vault_latest.py
File formatted successfully: /path/to/your/project/entities/fastapi/schema_pgsodium_latest.py
File formatted successfully: /path/to/your/project/entities/fastapi/schema_auth_latest.py
File formatted successfully: /path/to/your/project/entities/fastapi/schema_storage_latest.py
File formatted successfully: /path/to/your/project/entities/fastapi/schema_realtime_latest.py
File formatted successfully: /path/to/your/project/entities/fastapi/schema_net_latest.py
File formatted successfully: /path/to/your/project/entities/fastapi/schema_supabase_functions_latest.py
File formatted successfully: /path/to/your/project/entities/fastapi/schema__analytics_latest.py
File formatted successfully: /path/to/your/project/entities/fastapi/schema_extensions_latest.py
Note that each schema will have its own BaseModel file generated in the entities
directory of your project. As a result, each will have a prepended schema_
prefix and a _latest
suffix, with the name of the corresponding schema.
Conclusion¶
Using the --schema
option with the generate
command makes it easy to generate Pydantic models for select database schemas. The --all-schemas
option is particularly useful if you want to create models for every schema without specifying each one individually.
Please note that some of the following features which will be created in future releases:
- Enable better foreign table key linking for relationships with foreign schemas.