diff --git a/backend/internal/features/backups/backups/usecases/postgresql/create_backup_uc.go b/backend/internal/features/backups/backups/usecases/postgresql/create_backup_uc.go index 7fc6a27..156960b 100644 --- a/backend/internal/features/backups/backups/usecases/postgresql/create_backup_uc.go +++ b/backend/internal/features/backups/backups/usecases/postgresql/create_backup_uc.go @@ -334,6 +334,17 @@ func (uc *CreatePostgresqlBackupUsecase) buildPgDumpArgs(pg *pgtypes.PostgresqlD "--verbose", } + // Add schema filters if specified + if pg.Schemas != nil && *pg.Schemas != "" { + schemas := strings.Split(*pg.Schemas, ",") + for _, schema := range schemas { + schema = strings.TrimSpace(schema) + if schema != "" { + args = append(args, "--schema", schema) + } + } + } + compressionArgs := uc.getCompressionArgs(pg.Version) return append(args, compressionArgs...) } diff --git a/backend/internal/features/databases/databases/postgresql/model.go b/backend/internal/features/databases/databases/postgresql/model.go index a819878..daed21e 100644 --- a/backend/internal/features/databases/databases/postgresql/model.go +++ b/backend/internal/features/databases/databases/postgresql/model.go @@ -29,6 +29,7 @@ type PostgresqlDatabase struct { Password string `json:"password" gorm:"type:text;not null"` Database *string `json:"database" gorm:"type:text"` IsHttps bool `json:"isHttps" gorm:"type:boolean;default:false"` + Schemas *string `json:"schemas" gorm:"type:text"` } func (p *PostgresqlDatabase) TableName() string { @@ -85,6 +86,7 @@ func (p *PostgresqlDatabase) Update(incoming *PostgresqlDatabase) { p.Username = incoming.Username p.Database = incoming.Database p.IsHttps = incoming.IsHttps + p.Schemas = incoming.Schemas if incoming.Password != "" { p.Password = incoming.Password diff --git a/backend/internal/features/restores/usecases/postgresql/restore_backup_uc.go b/backend/internal/features/restores/usecases/postgresql/restore_backup_uc.go index ddedd1d..d307e21 100644 --- a/backend/internal/features/restores/usecases/postgresql/restore_backup_uc.go +++ b/backend/internal/features/restores/usecases/postgresql/restore_backup_uc.go @@ -83,6 +83,17 @@ func (uc *RestorePostgresqlBackupUsecase) Execute( "--no-acl", // Skip restoring access privileges (GRANT/REVOKE commands) } + // Add schema filters if specified + if pg.Schemas != nil && *pg.Schemas != "" { + schemas := strings.Split(*pg.Schemas, ",") + for _, schema := range schemas { + schema = strings.TrimSpace(schema) + if schema != "" { + args = append(args, "--schema", schema) + } + } + } + return uc.restoreFromStorage( originalDB, tools.GetPostgresqlExecutable( diff --git a/backend/migrations/20251210053223_add_schemas_column.sql b/backend/migrations/20251210053223_add_schemas_column.sql new file mode 100644 index 0000000..d7f2780 --- /dev/null +++ b/backend/migrations/20251210053223_add_schemas_column.sql @@ -0,0 +1,15 @@ +-- +goose Up +-- +goose StatementBegin + +ALTER TABLE postgresql_databases + ADD COLUMN schemas TEXT; + +-- +goose StatementEnd + +-- +goose Down +-- +goose StatementBegin + +ALTER TABLE postgresql_databases + DROP COLUMN IF EXISTS schemas; + +-- +goose StatementEnd diff --git a/frontend/src/entity/databases/model/postgresql/PostgresqlDatabase.ts b/frontend/src/entity/databases/model/postgresql/PostgresqlDatabase.ts index ad1f592..80b26e6 100644 --- a/frontend/src/entity/databases/model/postgresql/PostgresqlDatabase.ts +++ b/frontend/src/entity/databases/model/postgresql/PostgresqlDatabase.ts @@ -11,4 +11,5 @@ export interface PostgresqlDatabase { password: string; database?: string; isHttps: boolean; + schemas?: string; } diff --git a/frontend/src/features/backups/ui/BackupsComponent.tsx b/frontend/src/features/backups/ui/BackupsComponent.tsx index c0bcd79..a96c1fa 100644 --- a/frontend/src/features/backups/ui/BackupsComponent.tsx +++ b/frontend/src/features/backups/ui/BackupsComponent.tsx @@ -649,7 +649,7 @@ export const BackupsComponent = ({ database, isCanManageDBs, scrollContainerRef {showingRestoresBackupId && ( setShowingRestoresBackupId(undefined)} title="Restore from backup" diff --git a/frontend/src/features/databases/ui/edit/EditDatabaseSpecificDataComponent.tsx b/frontend/src/features/databases/ui/edit/EditDatabaseSpecificDataComponent.tsx index 9203178..388b63d 100644 --- a/frontend/src/features/databases/ui/edit/EditDatabaseSpecificDataComponent.tsx +++ b/frontend/src/features/databases/ui/edit/EditDatabaseSpecificDataComponent.tsx @@ -275,6 +275,32 @@ export const EditDatabaseSpecificDataComponent = ({ )} +
+
Schemas
+ { + if (!editingDatabase.postgresql) return; + + setEditingDatabase({ + ...editingDatabase, + postgresql: { ...editingDatabase.postgresql, schemas: e.target.value.trim() }, + }); + setIsConnectionTested(false); + }} + size="small" + className="max-w-[200px] grow" + placeholder="public,myschema (optional)" + /> + + + + +
+
Use HTTPS
{
{database.postgresql?.database || ''}
+
+
Schemas
+
{database.postgresql?.schemas || 'All (full backup)'}
+
+
Use HTTPS
{database.postgresql?.isHttps ? 'Yes' : 'No'}