Add Alembic to project for database migrations

This commit is contained in:
Lexi / Zoe 2022-04-15 16:10:38 +02:00
parent 7755bfb46d
commit 7ce43a2bfe
Signed by: binaryDiv
GPG key ID: F8D4956E224DA232
15 changed files with 256 additions and 49 deletions

View file

@ -60,12 +60,8 @@ class App(Flask):
# Import models to fill the metadata object
import tofu_api.models # noqa (unused import)
# Create all tables
# TODO: Use migrations instead
db.create_all_tables()
def create_app() -> Flask:
def create_app() -> App:
"""
App factory, returns a Flask app object.
"""

View file

@ -1,3 +1 @@
from .metadata import metadata_obj
from .model import Model
from .sqlalchemy import SQLAlchemy

View file

@ -1,10 +0,0 @@
from sqlalchemy.orm import declarative_base
from .metadata import metadata_obj
__all__ = [
'Model',
]
# Generate declarative base class for database models
Model = declarative_base(name='Model', metadata=metadata_obj)

View file

@ -1,12 +1,11 @@
from typing import Optional, cast
from flask import Flask
from sqlalchemy import MetaData, create_engine
from sqlalchemy import create_engine
from sqlalchemy.engine import Engine
from sqlalchemy.orm import Session, scoped_session, sessionmaker
from tofu_api.common.config import Config
from .metadata import metadata_obj
__all__ = [
'SQLAlchemy',
@ -70,22 +69,3 @@ class SQLAlchemy:
# For all further purposes, the scoped session should be treated like a regular Session object.
# Use cast() so we can use Session as the type annotation.
return cast(Session, self._scoped_session)
@property
def metadata(self) -> MetaData:
"""
Database metadata object.
"""
return metadata_obj
def create_all_tables(self) -> None:
"""
Create tables in the database for all models defined in the metadata.
"""
self.metadata.create_all(self.engine)
def drop_all_tables(self) -> None:
"""
Delete tables in the database for all models defined in the metadata.
"""
self.metadata.drop_all(self.engine)

View file

@ -1 +1,5 @@
# Base model first
from .base import metadata, BaseModel
# Data models
from .task import Task

View file

@ -1,7 +1,9 @@
from sqlalchemy import MetaData
from sqlalchemy.orm import declarative_base
__all__ = [
'metadata_obj',
'metadata',
'BaseModel',
]
# Define naming convention for constraints
@ -13,5 +15,8 @@ _naming_convention = {
"pk": "pk_%(table_name)s"
}
# Create global metadata object for database schemas
metadata_obj = MetaData(naming_convention=_naming_convention)
# Create metadata object for database schemas
metadata = MetaData(naming_convention=_naming_convention)
# Generate declarative base class for database models
BaseModel = declarative_base(name='BaseModel', metadata=metadata)

View file

@ -1,9 +1,9 @@
from sqlalchemy import Column, Integer, String, Text
from tofu_api.common.database import Model
from .base import BaseModel
class Task(Model):
class Task(BaseModel):
"""
Database model for tasks.
"""