Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 12 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@ data access.
This project uses a **PEP 420 namespace package** structure with three main
components:

- **`ca_biositing.datamodels`**: Shared SQLModel database models and database
configuration
- **`ca_biositing.datamodels`**: Shared LinkML/SQLModel database models and
database configuration
- **`ca_biositing.pipeline`**: ETL pipelines orchestrated with Prefect, deployed
via Docker
- **`ca_biositing.webservice`**: FastAPI REST API for data access
Expand Down Expand Up @@ -152,6 +152,7 @@ Key tasks:
- **Development**: `test`, `test-cov`, `pre-commit`, `pre-commit-all`
- **Applications**: `start-webservice`, `qgis`
- **Database**: `access-db`, `check-db-health`
- **Datamodels**: `update-schema`, `migrate`

## Architecture

Expand Down Expand Up @@ -181,6 +182,15 @@ Pipeline architecture:

### Database Models

We use a **LinkML-first approach** for defining our data schema. The workflow
is:

1. **LinkML Schema**: The schema is defined in YAML files (source of truth).
2. **SQLAlchemy Generation**: Python classes are automatically generated from
LinkML.
3. **Alembic Migrations**: Database migrations are generated from the Python
classes.

SQLModel-based models provide:

- Type-safe database operations
Expand Down
26 changes: 14 additions & 12 deletions alembic/env.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,17 +13,18 @@
load_dotenv(dotenv_path=PROJECT_ROOT / ".env") # Looks for .env in the project root by default

# --- Import your models so Alembic knows about them ---
from ca_biositing.datamodels.biomass import *
from ca_biositing.datamodels.data_and_references import *
from ca_biositing.datamodels.experiments_analysis import *
from ca_biositing.datamodels.external_datasets import *
from ca_biositing.datamodels.geographic_locations import *
from ca_biositing.datamodels.metadata_samples import *
from ca_biositing.datamodels.organizations import *
from ca_biositing.datamodels.people_contacts import *
from ca_biositing.datamodels.sample_preprocessing import *
from ca_biositing.datamodels.specific_aalysis_results import *
from ca_biositing.datamodels.user import *
# from ca_biositing.datamodels.biomass import *
# from ca_biositing.datamodels.data_and_references import *
# from ca_biositing.datamodels.experiments_analysis import *
# from ca_biositing.datamodels.external_datasets import *
# from ca_biositing.datamodels.geographic_locations import *
# from ca_biositing.datamodels.metadata_samples import *
# from ca_biositing.datamodels.organizations import *
# from ca_biositing.datamodels.people_contacts import *
# from ca_biositing.datamodels.sample_preprocessing import *
# from ca_biositing.datamodels.specific_aalysis_results import *
# from ca_biositing.datamodels.user import *
from ca_biositing.datamodels.schemas.generated.ca_biositing import *
from sqlmodel import SQLModel
import importlib.util
from pathlib import Path
Expand Down Expand Up @@ -51,7 +52,8 @@
# See: https://alembic.sqlalchemy.org/en/latest/autogenerate.html#affecting-the-autogenerate-process

# Start with the default SQLModel metadata
target_metadata = SQLModel.metadata
# target_metadata = SQLModel.metadata
target_metadata = Base.metadata

# Manually merge metadata from generated modules
# for table in census_metadata.tables.values():
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
"""Initial migration
"""Deleted duplicate .yaml files

Revision ID: 301006b4795f
Revises: e15bda744fef
Create Date: 2025-11-12 20:54:01.573577
Revision ID: 184417c6d044
Revises: bfa07351a507
Create Date: 2025-12-17 19:03:32.278635

"""
from typing import Sequence, Union
Expand All @@ -12,8 +12,8 @@


# revision identifiers, used by Alembic.
revision: str = '301006b4795f'
down_revision: Union[str, Sequence[str], None] = 'e15bda744fef'
revision: str = '184417c6d044'
down_revision: Union[str, Sequence[str], None] = 'bfa07351a507'
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None

Expand Down
Loading
Loading