Source code for flask_constance.backends.fsqla

import typing as t

try:
    import sqlalchemy as sa
    import sqlalchemy.orm as orm
    from sqlalchemy.orm.attributes import flag_modified
except ImportError as err:
    raise ImportError(
        "Flask-SQLAlchemy extension must be installed to use it as a backend for Flask-Constance"
    ) from err

from .base import Backend


[docs]class SettingMixin: """Model mixin for Flask-SQLAlchemy backend""" __abstract__ = True __tablename__ = "constance_settings" id = sa.Column(sa.Integer, primary_key=True) name = sa.Column(sa.String(256), unique=True, nullable=False, index=True) value = sa.Column(sa.JSON, nullable=True) def __repr__(self) -> str: return f"<Setting {self.name}>" def __str__(self) -> str: return t.cast(str, self.name)
[docs]class FlaskSQLAlchemyBackend(Backend): """Flask-SQLAlchemy backend :param model: Model which describes settings. :param session: Database session. """ def __init__(self, model: orm.DeclarativeMeta, session: orm.scoped_session): self.model = model self.session = session
[docs] def get(self, name: str) -> t.Any: """Get setting value. :param key: Name of the setting. """ instance = self.model.query.filter_by(name=name).first() # type: ignore if instance is not None: return instance.value raise KeyError(name)
[docs] def set(self, name: str, value: t.Any) -> None: """Set setting value :param key: Name of the setting. :param value: Value of the setting. """ transaction = self.session.begin(nested=True) instance = self.model.query.filter_by(name=name).first() # type: ignore if instance is None: instance = self.model(name=name, value=value) instance.value = value flag_modified(instance, "value") transaction.session.add(instance) transaction.commit()