[PYTHON] Utiliser Enum avec SQLAlchemy

Type Enum pratique Cependant, si vous souhaitez l'utiliser dans une application Web, vous souhaitez l'utiliser tel quel dans O / R Mapper.

SQLAlchemy facilite la définition de vos propres types qui encapsulent les types existants en utilisant TypeDecorator. Essayez d'encapsuler Integer et d'enregistrer Enum.

from __future__ import print_function, division, absolute_import
from sqlalchemy import Integer
from sqlalchemy.types import TypeDecorator


class EnumType(TypeDecorator):
    """Store IntEnum as Integer"""

    impl = Integer

    def __init__(self, *args, **kwargs):
        self.enum_class = kwargs.pop('enum_class')
        TypeDecorator.__init__(self, *args, **kwargs)

    def process_bind_param(self, value, dialect):
        if value is not None:
            if not isinstance(value, self.enum_class):
                raise TypeError("Value should %s type" % self.enum_class)
            return value.value

    def process_result_value(self, value, dialect):
        if value is not None:
            if not isinstance(value, int):
                raise TypeError("value should have int type")
            return self.enum_class(value)

Nous avons maintenant un type de colonne dédié pour stocker l'enum spécifié par l'argument mot-clé ʻenum_class`. Utilisons-le.

import enum
from sqlalchemy import Integer, Column, create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker


Base = declarative_base()

Color = enum.Enum("Color", "red green yellow")

class Light(Base):
    __tablename__ = 'some_table'
    id = Column(Integer, primary_key=True)
    color = Column(EnumType(enum_class=Color))


engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)

Session = sessionmaker(bind=engine)
session = Session()

session.add(Light(color=Color.red))
session.commit()

for L in session.query(Light).all():
    print(L.id, L.color)

session.add(Light(color=42))
session.commit()

Le résultat de l'exécution sera comme ça

1 Color.red
Traceback (most recent call last):
...
  File "enum_column_sample.py", line 19, in process_bind_param
    raise TypeError("Value should %s type" % self.enum_class)
sqlalchemy.exc.StatementError: Value should <enum 'Color'> type (original cause: TypeError: Value should <enum 'Color'> type) u'INSERT INTO some_table (color) VALUES (?)' [{'color': 42}]

De cette manière, les valeurs extraites de la base de données sont correctement renvoyées à Enum, et les valeurs entières non-Enum sont maintenant expulsées avec Insert.

Recommended Posts

Utiliser Enum avec SQLAlchemy
Utiliser DATE_FORMAT avec le filtre SQLAlchemy
Utilisation de la base de données SQL d'Azure avec SQL Alchemy
Comment utiliser SQLAlchemy / Connect avec aiomysql
Utilisez mecab-ipadic-neologd avec igo-python
Utilisez RTX 3090 avec PyTorch
Utiliser ansible avec cygwin
Utiliser pipdeptree avec virtualenv
[Python] Utiliser JSON avec Python
Utilisez Mock avec pytest
Utiliser l'indicateur avec pd.merge
Utiliser Gentelella avec Django
Utiliser mecab avec Python 3
Utiliser tensorboard avec Chainer
Utiliser DynamoDB avec Python
Utilisez SQL Alchemy et le multitraitement
Utiliser pip avec MSYS2
Utilisez Python 3.8 avec Anaconda
Utiliser les droits d'auteur avec Spacemacs
Utiliser TypeScript avec django-compresseur
Utiliser MySQL avec Django
Utiliser tensorboard avec NNabla
Utiliser le GPS avec Edison
Utilisez nim avec Jupyter
Obtenez la table dynamiquement avec sqlalchemy
Utiliser la mémoire partagée avec une bibliothèque partagée
Utiliser des balises personnalisées avec PyYAML
Utiliser des graphiques directionnels avec networkx
Utiliser TensorFlow avec Intellij IDEA
Utiliser l'API Twitter avec Python
Utiliser pip avec Jupyter Notebook
Utiliser TUN / TAP avec Python
Utilisez sqlite3 avec NAO (Pepper)
Utilisez les load_extensions de sqlite avec Pyramid
Introduction à RDB avec sqlalchemy Ⅰ
Utiliser les polices Windows 10 avec WSL
Comment mettre à jour avec SQLAlchemy?
Utilisation du chainer avec Jetson TK1
Utiliser SSL avec Celery + Redis
Utiliser Cython avec Jupyter Notebook
Utilisez Maxout + CNN avec Pylearn2
Comment modifier avec SQLAlchemy?
Utilisez WDC-433SU2M2 avec Manjaro Linux
Utilisez OpenBLAS avec numpy, scipy
Group_by avec sqlalchemy et sum
Utiliser l'API subsonique avec python3
Prise en charge de plusieurs sessions avec SQL Alchemy
Utilisation de Sonicwall NetExtener avec Systemd
Utilisez prefetch_related commodément avec Django
Comment supprimer avec SQLAlchemy?
Utiliser l'interpréteur AWS avec Pycharm
Utilisation de Bokeh avec IPython Notebook
Utiliser une plage de type Python avec Rust
Utiliser MLflow avec Databricks ④ --Call model -
Utiliser pyright avec CentOS7, emacs lsp-mode
Python: comment utiliser async avec
Utilisez vl53l0x avec RaspberryPi (python)
Connectez-vous à plusieurs bases de données avec SQL Alchemy
Utilisez PX-S1UD / PX-Q1UD avec Jetson nano