我正在尝试创建一个简单的付款记录应用程序,它存储金额和付款类型。 对于付款类型,我有“现金”和“信用”,它们在模式中定义:
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
的输入,但这不是我的想法。如何确保条目仅接受定义的两个条目之一?
你实际上不能。 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