Source code for reana_db.database
# -*- coding: utf-8 -*-
#
# This file is part of REANA.
# Copyright (C) 2018, 2020, 2021 CERN.
#
# REANA is free software; you can redistribute it and/or modify it
# under the terms of the MIT License; see LICENSE file for more details.
"""Database management for REANA."""
from __future__ import absolute_import
from sqlalchemy import create_engine, event
from sqlalchemy.orm import scoped_session, sessionmaker
from sqlalchemy.schema import CreateSchema
from sqlalchemy_utils import create_database, database_exists
from .config import (
SQLALCHEMY_DATABASE_URI,
SQLALCHEMY_MAX_OVERFLOW,
SQLALCHEMY_POOL_PRE_PING,
SQLALCHEMY_POOL_RECYCLE,
SQLALCHEMY_POOL_SIZE,
SQLALCHEMY_POOL_TIMEOUT,
)
from reana_db.models import Base # isort:skip # noqa
engine = create_engine(
SQLALCHEMY_DATABASE_URI,
max_overflow=SQLALCHEMY_MAX_OVERFLOW,
pool_pre_ping=SQLALCHEMY_POOL_PRE_PING,
pool_recycle=SQLALCHEMY_POOL_RECYCLE,
pool_size=SQLALCHEMY_POOL_SIZE,
pool_timeout=SQLALCHEMY_POOL_TIMEOUT,
)
Session = scoped_session(sessionmaker(autocommit=False, autoflush=False, bind=engine))
Base.query = Session.query_property()
[docs]def init_db():
"""Initialize the DB."""
import reana_db.models
reana_schema_name = "__reana"
if not engine.dialect.has_schema(engine, reana_schema_name):
event.listen(Base.metadata, "before_create", CreateSchema(reana_schema_name))
if not database_exists(engine.url):
create_database(engine.url)
Base.metadata.create_all(bind=engine)