具有Postgres upserts的SQLAlchemy before_update事件

时间:2018-10-18 05:39:43

标签: python postgresql sqlalchemy python-3.6 postgresql-10

我有一个脚本,可以使用upserts将数据保存并更新到Postgres数据库:

        messageins = insert(Message).values(
            id = message.id,
            iserased = message.iserased,
            erasedby = eraserid,
            author = message.author.id,
            body = message.body,
            private = message.isprivate,
            created = convTime(message.timecreated),
            edited = convTime(message.timeedited),
            lobby = message.lobbyid,
            usermentions = message.mentions,
        )

        message_dict = {
            c.name: c
            for c in messageins.excluded
        }

        update_message = messageins.on_conflict_do_update(
            index_elements = ["id"],
            set_=message_dict
        )

        newdb.execute(update_message)

我正在尝试在before_update事件上运行一个函数:

def saveHistory(mapper, connect, target):
    historicaldata = dict(target)
    print("SaveHistory triggered\n")

event.listen(Message, 'before_insert', saveHistory)
event.listen(Message, 'before_update', saveHistory)

saveHistory函数未运行。我在有关Postgres特定事件的文档中看不到任何东西。这些事件侦听器是否应该与on_conflict_do_update()方法一起使用?

1 个答案:

答案 0 :(得分:0)

使用insert()生成Postgres upserts将绕过事件挂钩所在的ORM。不支持将事件挂钩与这种插入数据的方法一起使用。

JS SDK