簡體   English   中英

嘗試使用 FastAPI/SQLite 進行 POST 時獲取 (sqlite3.IntegrityError) NOT NULL 約束失敗

[英]Getting (sqlite3.IntegrityError) NOT NULL constraint failed when trying to POST using FastAPI/ SQLite

我收到以下錯誤

sqlalchemy.exc.IntegrityError: (sqlite3.IntegrityError) NOT NULL constraint failed: SignalJourneyAudienceConstraints.constraintId
[SQL: INSERT INTO "SignalJourneyAudienceConstraints" ("sourceId", "constraintTypeId", "constraintValue", targeting, frequency, period) VALUES (?, ?, ?, ?, ?, ?)]
[parameters: (None, 10, 'STRING', 1, None, None)]

嘗試使用以下端點時。 我已經制作了所有字段,除了:

  • constraintTypeId: 整數
  • 約束值:str
  • 目標:布爾

暫時作為可選。

端點

# mail.py

...

@app.post("/add-new-audience-constraint", status_code=status.HTTP_200_OK)
def add_new_audience_constraint(
    sjac: schema.SignalJourneyAudienceConstraints, db: Session = Depends(get_db)
):
    """Sets the main query data."""
    new_audience_constraint = models.SignalJourneyAudienceConstraints(
        constraintTypeId=sjac.constraintTypeId,
        constraintValue=sjac.constraintValue.upper(),
        targeting=True,
    )

    db.add(new_audience_constraint)
    db.commit()

    return {"message": "Data added successfully."}

Model

# models.py 

class SignalJourneyAudienceConstraints(Base):
    """Signal Journey Audience Constraints"""

    __tablename__ = "SignalJourneyAudienceConstraints"
    constraintId = Column(Integer, primary_key=True)
    audienceId = Column(
        Integer,
        ForeignKey("SignalJourneyAudiences.audienceId"),
        primary_key=True,
    )
    sourceId = Column(Integer, ForeignKey("SignalJourneySources.sourceId"))
    constraintTypeId = Column(
        Integer, ForeignKey("SignalJourneyConstraintType.constraintTypeId")
    )
    constraintValue = Column(String)
    targeting = Column(Boolean)
    frequency = Column(Integer)
    period = Column(Integer)

圖式

# schema.py
class SignalJourneyAudienceConstraints(BaseModel):
    """SignalJourneyAudienceConstraints BaseModel."""

    constraintId: Optional[int]  # PK
    audienceId: Optional[int]  # FK - SignalJourneyAudiences -> audienceId
    sourceId: Optional[int]  # FK - SignalJourneySources -> sourceId
    constraintTypeId: int  # FK - SignalJourneyConstraintType -> constraintTypeId
    constraintValue: str
    targeting: bool
    frequency: Optional[int]
    period: Optional[int]

    class Config:
        """config class"""

        orm_mode = True

我研究了其他 SO 問題,但似乎沒有一個適合我所遇到的問題。 希望有人可以解釋發生了什么以及如何解決它

研發部

在此處輸入圖像描述

您有兩個字段列為 primary_key; 它們都是主鍵嗎? 由於您有兩個字段,因此主鍵字段不會自動定義為自動遞增字段; 為此,您只想擁有一個主鍵 integer 字段。

SQLAlchemy 只會在只有一個主鍵列且定義為 integer 時自動設置 SQLite 的auto_increment屬性。

由於定義復合鍵不是您想要的,因此使用constraintId作為單個自動遞增鍵(如您的 ERD 中所示)是您想要的 - 刪除audienceId字段的primary_key條目。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM