Multi-Tenancy API Reference
Tenant Strategies
| Strategy | Description | Use Case |
|---|---|---|
DatabasePerTenant | Separate DB per tenant | Strong isolation, regulatory |
SchemaPerTenant | Schema per tenant | Medium isolation, shared pool |
RowLevelSecurity | WHERE tenant_id filter | Shared table, simple scaling |
TenantRouter
NewTenantRouter(config, resolver, factory) *TenantRouter
router := quark.NewTenantRouter(
quark.TenantConfig{
Strategy: quark.SchemaPerTenant,
BaseClient: baseClient,
MaxCachedPools: 100, // For DatabasePerTenant
},
func(ctx context.Context) string {
return ctx.Value("tenant_id").(string) // Extract from context
},
func(tenantID string) (*quark.Client, error) {
// Create tenant-specific client
return quark.New("postgres", fmt.Sprintf(".../tenant_%s", tenantID))
},
)
Usage with Queries
// RowLevelSecurity: WHERE tenant_id = 'acme' is auto-injected
users, _ := quark.For[User](ctx, router).List()
// SchemaPerTenant: queries "acme.users"
orders, _ := quark.For[Order](ctx, router).List()
Tenant Router Methods
| Method | Description |
|---|---|
ResolveTenant(ctx) (string, error) | Extract tenant ID from context |
GetClient(ctx) (*Client, error) | Get tenant-specific client |
ActiveTenants() []string | List cached tenant connections |