我想公开一个API方法,该方法在POST请求中接收数据(对于beta注册API),并在已经存在匹配模型时使用新值进行upsert。实现这一目标的最佳方式是什么?目前我正在这样做(有点简化):
我的ORM模型(SqlAlchemy):
class BetaORM(Base):
__tablename__ = "betasignup"
email = Column(EmailType, primary_key=True)
fullname = Column(String, unique=False, index=False, nullable=True)
我的Pydantic模型:
class BetaCreate(BaseModel):
email: EmailStr
fullname: Optional[str]
我的FastAPI post方法:
@app.post("/beta_signup")
def post_beta_signup(beta: schemas.BetaCreate, db: Session = Depends(get_db)):
return create_beta_signup(db=db,signup=beta)
还有我写的CRUD方法:
def create_beta_signup(db: Session, signup: schemas.BetaCreate):
db_beta = schemas.BetaORM(**signup.dict())
ret_obj = db.merge(db_beta)
db.add(ret_obj)
db.commit()
return ret_obj
使用merge()的一个问题是,它依赖于直接针对电子邮件地址与主键进行匹配——我更愿意使用surrogate key,这样我就可以拥有禁用/删除功能,而不必在数据库级别强制对电子邮件地址进行唯一约束
如果您使用的是MySQL和SQLAlchemy>;=1.2您可以使用SQLAlchemy使用
INSERT...ON DUPLICATE KEY UPDATE
有关docs的更多信息
基于FastAPI sqlalchemy demo application,以下是a解决此问题的方法:
这种方法使用SQLAlchemy声明性模型定义(而不是Gabriel Cappelli使用的命令式定义)
Full source code
我使用这种方法在基于FastAPI的应用程序中对crud进行更新。现有数据保持不变,新的更新值将覆盖。修改后的日期时间会更新(但为了便于测试,此值是固定的)
希望能有帮助。(我花了太长时间才弄明白这一点。)
相关问题 更多 >
编程相关推荐