如果我有一個帖子串列,其中包含默認附加回呼的日期created和updated日期onupdate。
有時我需要標記帖子,以進行inappropriate reports或類似的操作。我不想修改created和updated日期。
如何onupdate在執行update操作時跳過定義的, ?
uj5u.com熱心網友回復:
SQLAlchemy的將采用默認的時
沒有為該列的 INSERT 或 UPDATE 陳述句提供值
然而,顯而易見的解決方法 - 將列顯式設定為其當前值 - 將不起作用,因為會話檢查該值是否實際更改,如果沒有,則不會傳遞值。這里有兩種可能的解決方案,假設 SQLAlchemy 1.4 和這個模型:
class Post(db.Model):
flag = db.Column(db.Boolean, default=False)
last_updated = db.Column(db.DateTime, default=some_func, onupdate=some_func)
使用事件監聽器
添加一個before update 偵聽器,用于檢測標志列何時被修改,并將時間戳列標記為已修改,即使其值未更改。這將使 SQLAlchemy 將當前值添加到更新中,因此不會呼叫 onupdate 函式。
import sqlalchemy as sa
...
@sa.event.listens_for(Post, 'before_update')
def receive_before_update(mapper, connection, target):
insp = sa.inspect(target)
flag_changed, _, _ = insp.attrs.flag.history
if flag_changed:
orm.attributes.flag_modified(target, 'last_updated')
使用 SQLAlchemy 核心而不是 ORM
SQLAlchemy 核心不需要會話,因此可以將當前時間戳值傳遞給更新以避免觸發 onupdate 函式。ORM 不會意識到以這種方式進行的任何更改,因此如果在會話的背景關系中完成,受影響的物件應該重繪 或過期。這是一種“快速而骯臟”的解決方案,但如果標記發生在正常應用程式流之外,則可能已經足夠好了。
with db.engine.begin() as conn:
posts = Post.__table__
update = sa.update(posts).where(...).values(flag=True, last_updated=posts.c.last_updated)
conn.execute(update)
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/334872.html
標籤:Python 蟒蛇-3.x 烧瓶 sqlalchemy 烧瓶-sqlalchemy
上一篇:如何匯入路由燒瓶
下一篇:Flask:如何將上傳的檔案作為輸入傳遞給方法?AttributeError:'_io.BytesIO'物件沒有屬性'lower'
