Sqlalchemy 和 Python - 返回 ID 的 upsert 语句

Omr*_*eor 6 python sqlalchemy

我正在写一个 sqlalchemy upsert 语句,我想知道是否有办法从数据库取回 Id?到目前为止我的代码如下:

def handle_events(self, events):
    agg = []
    agg.extend(self._get_dicts(events))
    if not agg:
        return
    with DB.session(writable=True) as session:
        response = session.execute(self._generate_upsert_stmnt(agg))


def _generate_upsert_stmnt(self, items):
    model_class = models.MyModel
    table = model_class.__table__
    insert_statement = sa.dialects.postgresql.insert(table, items)
    upsert_statement = insert_statement.on_conflict_do_update(
        index_elements=[table.c['id']],
        set_={c.name: c for c in insert_statement.excluded if c.name != ["id", "my_model", "my_model_id"]}
    )
    return upsert_statement
Run Code Online (Sandbox Code Playgroud)

此代码片段中的 Session 是从 sqlalchemy 的 api(包装在上下文管理器中)的 sessionmaker 调用返回的对象。有没有办法让这个 upsert 语句返回所有 id(插入的和更新的)?如果是这样,代码会是什么样子?提前致谢。ps 如果重要的话数据库是postgres。

Omr*_*eor 1

最终我使用了.returning(<column>)我的 upsert 语句,如下所示:

def _generate_upsert_stmnt(self, items):
    model_class = models.MyModel
    table = model_class.__table__
    insert_statement = sa.dialects.postgresql.insert(table, items)
    upsert_statement = insert_statement.on_conflict_do_update(
        index_elements=[table.c['id']],
        set_={c.name: c for c in insert_statement.excluded if c.name != 
        ["id", "my_model", "my_model_id"]}).returning(table.c['id'])
    return upsert_statement
Run Code Online (Sandbox Code Playgroud)

并像这样提取数据:

    def _extract_ids_from_resultproxy(self, result):
        table = models.MyModel.__table__
        return [row[table.c.id] for row in result]
Run Code Online (Sandbox Code Playgroud)