如何确保插入只接受枚举中定义的值?

问题描述 投票:0回答:1

我正在尝试创建一个简单的付款记录应用程序,它存储金额和付款类型。 对于付款类型,我有“现金”和“信用”,它们在模式中定义:

from enum import Enum

class Mode(Enum):
    cash: str
    upi: str

然后,我将要创建的表及其字段定义为:

from sqlalchemy import Column, Integer, Float, Enum
from utils.database import Base
from utils.paytype import Mode


class Records(Base):
    __tablename__ = "records"

    id = Column(Integer, primary_key=True, index=True)
    amount = Column(Float, nullable=False)
    payment_type = Column(Enum(Mode), nullable=False)

当我尝试向表中添加条目时,我可以提供任何字符串作为

payment_type
的输入,但这不是我的想法。如何确保条目仅接受定义的两个条目之一?

python python-3.x sqlite enums
1个回答
0
投票

你实际上不能。 sqlite 中没有 Enum 类型:https://www.sqlite.org/datatype3.html

您可以做的是使用

pydantic
检查输入数据并最终提出
ValidationError

from sqlalchemy import Column, Integer, Float, Enum, String
from utils.database import Base
from utils.paytype import Mode

from pydantic import BaseModel
from typing import Literal

class Records(Base):
    __tablename__ = "records"

    id = Column(Integer, primary_key=True, index=True)
    amount = Column(Float, nullable=False)
    payment_type = Column(String, nullable=False)

class RecordCreate(BaseModel):
    amount: float
    payment_type: Literal["cash", "credit"]

这边

record = RecordCreate(amount=3.14, payment_type="credit") # OK
record = RecordCreate(amount=3.14, payment_type="foo")    # raise ValidationError

最后你可以做类似的事情

Records(**record.dict())        # with Pydantic v1
Records(**record.model_dump())  # with Pydantic v2
© www.soinside.com 2019 - 2024. All rights reserved.