1 回答

TA貢獻(xiàn)1825條經(jīng)驗(yàn) 獲得超6個(gè)贊
update_stmt = insert_stmt.on_conflict_do_update(
index_elements=[MyTable.id],
set_=dict(data=values)
)
index_elements 應(yīng)該是字符串列表或列對(duì)象列表。所以要么[MyTable.id]或['id'](這是正確的)
set_ 應(yīng)該是一個(gè)以列名作為鍵和有效的 sql 更新對(duì)象作為值的字典。您可以使用excluded屬性從插入塊中引用值。所以為了得到你想要的結(jié)果,你會(huì)想要set_={'test_value': insert_stmt.excluded.test_value}(你犯的錯(cuò)誤是data=在示例中不是一個(gè)神奇的參數(shù)......它是他們示例表中列的名稱)
所以,整件事就是
update_stmt = insert_stmt.on_conflict_do_update(
index_elements=[MyTable.id],
set_={'test_value': insert_stmt.excluded.test_value}
)
當(dāng)然,在現(xiàn)實(shí)世界的例子中,我通常想要更改不止一列。在那種情況下,我會(huì)做類似的事情......
update_columns = {col.name: col for col in insert_stmt.excluded if col.name not in ('id', 'datetime_created')}
update_statement = insert_stmt.on_conflict_do_update(index_elements=['id'], set_=update_columns)
(此示例將覆蓋除 id 和 datetime_created 列之外的每一列)
添加回答
舉報(bào)