第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

使用 SQLAlchemy Postgres 進(jìn)行批量更新

使用 SQLAlchemy Postgres 進(jìn)行批量更新

精慕HU 2021-12-17 14:42:54
我正在按照此處的 SQLAlchemy 文檔使用 Postgres 編寫批量更新插入語句。出于演示目的,我有一個(gè)簡(jiǎn)單的表MyTable:class MyTable(base):    __tablename__ = 'mytable'    id = Column(types.Integer, primary_key=True)    test_value = Column(types.Text)創(chuàng)建一個(gè)通用的插入語句很簡(jiǎn)單:from sqlalchemy.dialects import postgresqlvalues = [{'id': 0, 'test_value': 'a'}, {'id': 1, 'test_value': 'b'}]insert_stmt = postgresql.insert(MyTable.__table__).values(values)我遇到的問題是當(dāng)我嘗試添加 upsert 的“沖突”部分時(shí)。update_stmt = insert_stmt.on_conflict_do_update(    index_elements=[MyTable.id],    set_=dict(data=values))嘗試執(zhí)行此語句會(huì)產(chǎn)生一個(gè)ProgrammingError:from sqlalchemy import create_engineengine = create_engine('postgres://localhost/db_name')engine.execute(update_stmt)>>> ProgrammingError: (psycopg2.ProgrammingError) can't adapt type 'dict'我認(rèn)為我的誤解在于用on_conflict_do_update方法構(gòu)造語句。有誰知道如何構(gòu)造這個(gè)語句?我已經(jīng)查看了 StackOverflow 上的其他問題(例如here),但我似乎無法解決上述錯(cuò)誤。
查看完整描述

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 列之外的每一列)


查看完整回答
反對(duì) 回復(fù) 2021-12-17
  • 1 回答
  • 0 關(guān)注
  • 557 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)