<p>基于<a href="https://fastapi.tiangolo.com/tutorial/body-updates/?h=%20par#partial-updates-with-patch" rel="noreferrer">FastAPI sqlalchemy demo application</a>,以下是a解决此问题的方法:</p>
<pre class="lang-py prettyprint-override"><code>def update_user(db: Session, user: PydanticUserUpdate):
"""
Using a new update method seen in FastAPI https://github.com/tiangolo/fastapi/pull/2665
Simple, does not need each attribute to be updated individually
Uses python in built functionality... preferred to the pydintic related method
"""
# get the existing data
db_user = db.query(User).filter(User.id == user.id).one_or_none()
if db_user is None:
return None
# Update model class variable from requested fields
for var, value in vars(user).items():
setattr(db_user, var, value) if value else None
db_user.modified = modified_now
db.add(db_user)
db.commit()
db.refresh(db_user)
return db_user
</code></pre>
<p>这种方法使用SQLAlchemy声明性模型定义(而不是Gabriel Cappelli使用的命令式定义)</p>
<p><a href="https://github.com/mikey-no/pydantic-sqlalchemy-experiments/blob/main/main.py" rel="noreferrer">Full source code</a></p>
<p>我使用这种方法在基于FastAPI的应用程序中对crud进行更新。现有数据保持不变,新的更新值将覆盖。修改后的日期时间会更新(但为了便于测试,此值是固定的)</p>
<p>希望能有帮助。(我花了太长时间才弄明白这一点。)</p>