Add Alembic to project for database migrations
This commit is contained in:
parent
7755bfb46d
commit
7ce43a2bfe
15 changed files with 256 additions and 49 deletions
|
|
@ -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.
|
||||
"""
|
||||
|
|
|
|||
|
|
@ -1,3 +1 @@
|
|||
from .metadata import metadata_obj
|
||||
from .model import Model
|
||||
from .sqlalchemy import SQLAlchemy
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -1 +1,5 @@
|
|||
# Base model first
|
||||
from .base import metadata, BaseModel
|
||||
|
||||
# Data models
|
||||
from .task import Task
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
@ -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.
|
||||
"""
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue