- PostgreSQL - Primary database
- Peewee - ORM (model classes defined in
data/database.py) - Alembic - Migrations (via
data/model/sqlalchemybridge.pywhich converts Peewee models to SQLAlchemy metadata) - Redis - Caching, sessions, build logs
Model class definitions (User, Repository, Manifest, Tag, ImageStorage,
etc.) all live in data/database.py. This single file is the schema source of
truth.
Query and business-logic modules live in data/model/:
user.py- User, FederatedLogin, Team, TeamMember queriesrepository.py- Repository, RepositoryPermission, Star queriesorganization.py- Organization, OrganizationMember queriesblob.py- Blob operationsstorage.py- ImageStorage managementbuild.py- RepositoryBuild, RepositoryBuildTrigger queriesnotification.py- Notification, RepositoryNotification queriesappspecifictoken.py- AppSpecificAuthToken querieslog.py- LogEntry queriesgc.py- Garbage collection logicproxy_cache.py- Pull-through cache configautoprune.py- Auto-pruning policiesnamespacequota.py- Namespace quota enforcementimmutability.py- Tag immutability rulesoci/- OCI-specific operations (tag, manifest, blob, label)
# Generate migration file
alembic revision -m "description_of_change"
# Edit the generated file in data/migrations/versions/
# Implement upgrade() and downgrade() functions# Apply all pending migrations
alembic upgrade head
# Apply to specific revision
alembic upgrade <revision_id>
# Rollback one migration
alembic downgrade -1- Always implement both
upgrade()anddowngrade() - Use
op.batch_alter_table()for SQLite compatibility in tests - Test migrations in both directions
- Include data migrations if needed (not just schema)
from data.database import db_transaction
# Use context manager for transactions
with db_transaction() as db:
user = User.select().where(User.username == 'admin').get_or_none()- Host: localhost:5432
- User: quay
- Password: quay
- Database: quay
- Connection:
postgresql://quay:quay@quay-db/quay
# Run tests with SQLite (default)
TEST=true PYTHONPATH="." pytest test/test_file.py -v
# Run tests with PostgreSQL
make test_postgres TESTS=test/test_file.pydata/database.py- Peewee model class definitions (schema source of truth)data/model/- Query and business-logic modulesdata/model/oci/- OCI-specific model operationsdata/model/sqlalchemybridge.py- Peewee-to-SQLAlchemy bridge for Alembicdata/registry_model/- Registry abstraction layer between models and v2 endpointsdata/migrations/env.py- Alembic environmentdata/migrations/versions/- Migration files