[PYTHON] Verwenden Sie Enum mit SQLAlchemy

Praktischer Aufzählungstyp Wenn Sie es jedoch in einer Webanwendung verwenden möchten, möchten Sie es so verwenden, wie es in O / R Mapper ist.

Mit SQLAlchemy können Sie ganz einfach Ihren eigenen Typ definieren, der einen vorhandenen Typ mit "TypeDecorator" umschließt. Versuchen Sie, Integer zu verpacken und Enum zu speichern.

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)

Wir haben jetzt einen dedizierten Spaltentyp zum Speichern der Aufzählung, die durch das Schlüsselwortargument "enum_class" angegeben wird. Lass es uns benutzen.

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()

Das Ausführungsergebnis wird so sein

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}]

Auf diese Weise werden die aus der Datenbank abgerufenen Werte ordnungsgemäß an Enum zurückgegeben, und Nicht-Enum-Ganzzahlwerte werden jetzt mit Einfügen gekickt.

Recommended Posts

Verwenden Sie Enum mit SQLAlchemy
Verwenden Sie DATE_FORMAT mit dem SQLAlchemy-Filter
Verwenden der SQL-Datenbank von Azure mit SQL Alchemy
Verwendung von SQLAlchemy / Connect mit aiomysql
Verwenden Sie mecab-ipadic-neologd mit igo-python
Verwenden Sie RTX 3090 mit PyTorch
Verwenden Sie ansible mit cygwin
Verwenden Sie pipdeptree mit virtualenv
[Python] Verwenden Sie JSON mit Python
Verwenden Sie Mock mit Pytest
Verwenden Sie den Indikator mit pd.merge
Verwenden Sie Gentelella mit Django
Verwenden Sie Mecab mit Python 3
Verwenden Sie Tensorboard mit Chainer
Verwenden Sie DynamoDB mit Python
Verwenden Sie SQL Alchemy und Multiprocessing
Verwenden Sie pip mit MSYS2
Verwenden Sie Python 3.8 mit Anaconda
Verwenden Sie Copyright mit Spacemacs
Verwenden Sie TypeScript mit Django-Kompressor
Verwenden Sie MySQL mit Django
Verwenden Sie Tensorboard mit NNabla
Verwenden Sie GPS mit Edison
Verwenden Sie nim mit Jupyter
Holen Sie sich die Tabelle dynamisch mit sqlalchemy
Verwenden Sie gemeinsam genutzten Speicher mit gemeinsam genutzten Bibliotheken
Verwenden Sie benutzerdefinierte Tags mit PyYAML
Verwenden Sie Richtungsdiagramme mit networkx
Verwenden Sie TensorFlow mit Intellij IDEA
Verwenden Sie die Twitter-API mit Python
Verwenden Sie pip mit Jupyter Notebook
Verwenden Sie TUN / TAP mit Python
Verwenden Sie sqlite3 mit NAO (Pepper)
Verwenden Sie die load_extensions von sqlite mit Pyramid
Einführung in RDB mit sqlalchemy Ⅰ
Verwenden Sie Windows 10-Schriftarten mit WSL
Wie aktualisiere ich mit SQLAlchemy?
Verwendung von Chainer mit Jetson TK1
Verwenden Sie SSL mit Sellerie + Redis
Verwenden Sie Cython mit Jupyter Notebook
Verwenden Sie Maxout + CNN mit Pylearn2
Wie mit SQLAlchemy ändern?
Verwenden Sie WDC-433SU2M2 mit Manjaro Linux
Verwenden Sie OpenBLAS mit numpy, scipy
Group_by mit sqlalchemy und sum
Verwenden Sie die Unterschall-API mit Python3
Unterstützt mehrere Sitzungen mit SQL Alchemy
Verwenden von Sonicwall NetExtener mit Systemd
Verwenden Sie prefetch_related bequem mit Django
Wie lösche ich mit SQLAlchemy?
Verwenden Sie einen AWS-Interpreter mit Pycharm
Verwenden von Bokeh mit IPython Notebook
Verwenden Sie Python-ähnliche Bereiche mit Rust
Verwenden Sie MLflow mit Databricks ④ - Anrufmodell -
Verwenden Sie pyright mit CentOS7, emacs lsp-mode
Python: So verwenden Sie Async mit
Verwenden Sie vl53l0x mit RaspberryPi (Python)
Stellen Sie mit SQL Alchemy eine Verbindung zu mehreren Datenbanken her
Verwenden Sie PX-S1UD / PX-Q1UD mit Jetson Nano