SQLAlchemy友好的UPDATE而不是INSERT触发器

时间:2015-06-13 14:21:26

标签: python postgresql sqlalchemy

我有一个AuthToken表,其中包含一个关联的AuthTokenHist表,我希望记录AuthToken中的所有状态更改。我想让模型的用户对任何存档进行透明化。因此,理想情况下,他们只需使用现有AuthToken的相同PK创建新的AuthTokens,数据库将更新AuthToken中的行,并在AuthToken已有该PK条目时在AuthTokenHist中创建一个新行。

我意识到我要求的内容非常接近于upsert,但是我在一个不支持upserts的旧postgresql版本上。此外,从SQLAlchemy的角度来看,我希望用户只要认为他们正在构建一个新的AuthToken,即使他们实际上正在更新现有的AuthToken。

我尝试使用INSERT触发器执行此操作,该触发器基本上删除现有的AuthToken,将一行插入AuthTokenHist并返回NEW。我无法通过sqlalchemy会话,但禁止在同一会话中拥有两个具有相同PK的对象

FlushError: New instance <AuthToken at 0x3f51150> with identity key (<class 'models.AuthToken'>, (15L, u'c41ffcc3-5dbc-4042-a990-0c 18020cf77b')) conflicts with persistent instance <AuthToken at 0x3f61350>

0 个答案:

没有答案