Skip to content

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 with registry.extra keys.

See Also