Multi-Database and Schema Workflow¶
Use this tutorial when your application needs:
- multiple databases (
registry.extra), or - per-tenant/per-schema query context.
Choosing the Right Path¶
flowchart TD
A["Need isolated data path"] --> B{"Different database server?"}
B -- Yes --> C["Use registry.extra + using(database=...)"]
B -- No --> D{"Same database, different schema?"}
D -- Yes --> E["Use using(schema=...) / with_schema(...)"]
D -- No --> F["Use default registry database/schema"]
Step 1: Declare Multiple Databases¶
import edgy
from edgy.core.db import fields
from edgy.testclient import DatabaseTestClient as Database
database = Database("<YOUR-CONNECTION-STRING>")
alternative = Database("<YOUR-ALTERNATIVE-CONNECTION-STRING>")
models = edgy.Registry(database=database, extra={"alternative": alternative})
class User(edgy.Model):
name: str = fields.CharField(max_length=255)
email: str = fields.CharField(max_length=255)
class Meta:
registry = models
Step 2: Write Data to an Extra Database¶
import edgy
from edgy.core.db import fields
from edgy.testclient import DatabaseTestClient as Database
database = Database("<YOUR-CONNECTION-STRING>")
alternative = Database("<YOUR-ALTERNATIVE-CONNECTION-STRING>")
models = edgy.Registry(database=database, extra={"alternative": alternative})
class User(edgy.Model):
name: str = fields.CharField(max_length=255)
email: str = fields.CharField(max_length=255)
class Meta:
registry = models
async def bulk_create_users() -> None:
"""
Bulk creates some users.
"""
await User.query.using(database="alternative").bulk_create(
[
{"name": "Edgy", "email": "edgy@example.com"},
{"name": "Edgy Alternative", "email": "edgy.alternative@example.com"},
]
)
Step 3: Use Schema Context for Tenant-Like Routing¶
For schema-scoped operations:
from edgy.core.db import with_schema
with with_schema("tenant_a"):
users = await User.query.all()
Or explicitly per query:
users = await User.query.using(schema="tenant_a").all()
Operational Notes¶
- Keep registry lifecycle open (
async with registry:) while serving requests. - Ensure target schemas exist before querying them.
- Keep database names in
using(database=...)aligned withregistry.extrakeys.