日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

oracle 触发器 upsert,如何使SQLAlchemy insert与Postgres多处理proof upsert触发器一起工作?...

發布時間:2025/3/19 数据库 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 oracle 触发器 upsert,如何使SQLAlchemy insert与Postgres多处理proof upsert触发器一起工作?... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

我有多處理應用程序,需要upsert(插入,如果存在更新)功能。在

我決定使用觸發器解決方案來接近upsert。(為每個名為is_upsert的啟用upsert的表添加額外的列,在觸發器檢查此字段時,如果為false,則執行正常插入,但如果為true,則執行upsert邏輯-嘗試更新,如果由于記錄不存在而失敗,則嘗試插入)。在

觸發邏輯如下:CREATE OR REPLACE FUNCTION upsert_trigger_function_{table}()

RETURNS TRIGGER AS $upsert_trigger_function$

DECLARE

row record;

BEGIN

RAISE NOTICE 'upsert trigger fired, upsert is %%', NEW.{upsert_column};

IF NEW.{upsert_column} THEN

NEW.{upsert_column} := false;

LOOP

UPDATE {table} SET

{update_set}

WHERE

{update_where}

;

IF found THEN

RETURN NULL;

END IF;

BEGIN

INSERT INTO {table} SELECT NEW.*;

RETURN NULL;

EXCEPTION WHEN unique_violation THEN

-- loop

END;

END LOOP;

RETURN NULL;

ELSE

RETURN NEW;

END IF;

END;

$upsert_trigger_function$ LANGUAGE plpgsql;

測試對象(add\u upsert只需安裝上述觸發器):

^{pr2}$

測試腳本from sqlalchemy.engine import create_engine

from pipelines.settings_proxy import TEST_DB

from sqlalchemy.orm.session import sessionmaker

from test_pipelines.test_persistence.mock_items import SimpleItem

from test_pipelines.test_persistence.helpers import random_simple_item

def main():

engine = create_engine(TEST_DB)

values = random_simple_item(_upsert=True)

session = sessionmaker(engine)()

si = SimpleItem(**values)

session.add(si)

session.commit()

si = SimpleItem(**values)

si.price = 1

session.merge(si)

session.commit()

它在使用SQL statesments時可以正常工作,但是當我將它與SQLAlchemy ORM add object一起使用時,它就有了Traceback (most recent call last):

File "pipelines/persistence/experiment_with_upsert_field.py", line 59, in

main()

File "pipelines/persistence/experiment_with_upsert_field.py", line 27, in main

session.commit()

File "/home/sebastian/local/virtualenvs/perception/lib/python3.4/site-packages/sqlalchemy/orm/session.py", line 801, in commit

self.transaction.commit()

File "/home/sebastian/local/virtualenvs/perception/lib/python3.4/site-packages/sqlalchemy/orm/session.py", line 392, in commit

self._prepare_impl()

File "/home/sebastian/local/virtualenvs/perception/lib/python3.4/site-packages/sqlalchemy/orm/session.py", line 372, in _prepare_impl

self.session.flush()

File "/home/sebastian/local/virtualenvs/perception/lib/python3.4/site-packages/sqlalchemy/orm/session.py", line 2019, in flush

self._flush(objects)

File "/home/sebastian/local/virtualenvs/perception/lib/python3.4/site-packages/sqlalchemy/orm/session.py", line 2137, in _flush

transaction.rollback(_capture_exception=True)

File "/home/sebastian/local/virtualenvs/perception/lib/python3.4/site-packages/sqlalchemy/util/langhelpers.py", line 60, in __exit__

compat.reraise(exc_type, exc_value, exc_tb)

File "/home/sebastian/local/virtualenvs/perception/lib/python3.4/site-packages/sqlalchemy/util/compat.py", line 184, in reraise

raise value

File "/home/sebastian/local/virtualenvs/perception/lib/python3.4/site-packages/sqlalchemy/orm/session.py", line 2101, in _flush

flush_context.execute()

File "/home/sebastian/local/virtualenvs/perception/lib/python3.4/site-packages/sqlalchemy/orm/unitofwork.py", line 373, in execute

rec.execute(self)

File "/home/sebastian/local/virtualenvs/perception/lib/python3.4/site-packages/sqlalchemy/orm/unitofwork.py", line 532, in execute

uow

File "/home/sebastian/local/virtualenvs/perception/lib/python3.4/site-packages/sqlalchemy/orm/persistence.py", line 174, in save_obj

mapper, table, insert)

File "/home/sebastian/local/virtualenvs/perception/lib/python3.4/site-packages/sqlalchemy/orm/persistence.py", line 800, in _emit_insert_statements

execute(statement, params)

File "/home/sebastian/local/virtualenvs/perception/lib/python3.4/site-packages/sqlalchemy/engine/base.py", line 914, in execute

return meth(self, multiparams, params)

File "/home/sebastian/local/virtualenvs/perception/lib/python3.4/site-packages/sqlalchemy/sql/elements.py", line 323, in _execute_on_connection

return connection._execute_clauseelement(self, multiparams, params)

File "/home/sebastian/local/virtualenvs/perception/lib/python3.4/site-packages/sqlalchemy/engine/base.py", line 1010, in _execute_clauseelement

compiled_sql, distilled_params

File "/home/sebastian/local/virtualenvs/perception/lib/python3.4/site-packages/sqlalchemy/engine/base.py", line 1159, in _execute_context

result = context._setup_crud_result_proxy()

File "/home/sebastian/local/virtualenvs/perception/lib/python3.4/site-packages/sqlalchemy/engine/default.py", line 828, in _setup_crud_result_proxy

self._setup_ins_pk_from_implicit_returning(row)

File "/home/sebastian/local/virtualenvs/perception/lib/python3.4/site-packages/sqlalchemy/engine/default.py", line 893, in _setup_ins_pk_from_implicit_returning

for col in table.primary_key

File "/home/sebastian/local/virtualenvs/perception/lib/python3.4/site-packages/sqlalchemy/engine/default.py", line 891, in

for col, value in [

TypeError: 'NoneType' object is not subscriptable

在深處升起sqlalchemy.engine.default. 我確信這是因為我的觸發器在執行UPSERT時返回NULL,而SQLAlchemy嘗試使用RETURNING語句傳播帶有插入ID的對象。它顯然失敗了,因為它不可能從它的從屬INSERT/UPDATE在觸發器中獲取正確的ID,同時阻止正常的正常插入。在

請注意,我已經將upsert作為一個特殊函數進行了測試,但這對我來說并不適用,因為我犧牲了SQLAlchemy在更新復雜項(那些與其他項有關系的項)方面的幫助。在

所以我的問題是:如何告訴SQLAlchemy避免加載插入的對象ID?

總結

以上是生活随笔為你收集整理的oracle 触发器 upsert,如何使SQLAlchemy insert与Postgres多处理proof upsert触发器一起工作?...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产噜噜噜噜噜久久久久久久久 | 美女露胸露尿口 | 欧美日韩亚洲精品一区二区 | 久久一区二区三区四区五区 | 岛国av噜噜噜久久久狠狠av | 久久久男女 | 丁香在线视频 | 青草视频免费观看 | 捆绑调教视频网站 | 成人av无码一区二区三区 | 欧美性大战久久久久久 | 成人h动漫精品一区二区 | 成人午夜精品无码区 | 一级特黄aa| 成人免费公开视频 | 国产黑丝在线 | 欧美成人aaaaa | 中国丰满人妻videoshd | 日干夜操| 欧美视频1区 | jizzjizz在线观看 | 伊人av一区| 伊人影院视频 | www爱爱 | 日本免费视频 | 午夜影院一区二区三区 | 亚洲色视频 | 免费看的一级片 | 人妻无码中文字幕免费视频蜜桃 | 最近最新中文字幕 | 国产成人免费片在线观看 | 老司机午夜影院 | 麻豆成人入口 | 国产免费aa | 国产精品成人aaaa在线 | 国产日韩在线观看视频 | 久久久久午夜 | 精品人妻av一区二区 | 国产av成人一区二区三区 | 国产又粗又猛又黄视频 | 亚洲成年人 | 手机看片国产日韩 | 久久综合激情 | 中文字幕 日韩 欧美 | 97国产成人| 超碰在线99| 国产特级黄色录像 | 男人天堂一区 | 国产特级黄色片 | 91精品视频一区 | 中文字幕日韩精品在线观看 | 亚洲第一页中文字幕 | 黄色日本网站 | 青娱乐激情 | 免费成人深夜夜行网站视频 | 久久久久久久久免费 | 欧美日韩免费 | 亚洲欧美久久久 | 春色导航 | 精品人妻二区中文字幕 | 国产一二三四五区 | 老司机av导航 | 午夜天堂在线观看 | 国产精品久久77777 | 国产激情一区二区三区在线观看 | 麻豆黄色片 | 18无码粉嫩小泬无套在线观看 | 日本在线一本 | a级大片免费看 | 一区二区三区四区五区六区 | 黄在线免费 | 国产精品三级久久久久久电影 | 九九一级片 | 蜜臀在线观看 | 国产成人在线视频网站 | 日韩精选av | 女性裸体瑜伽无遮挡 | 在线观看aaa| 国产xxxx孕妇 | 黄色片网站视频 | 久久国产精品久久久久久 | 天堂va欧美ⅴa亚洲va一国产 | 亚洲天堂自拍偷拍 | 免费一级特黄毛大片 | 男人av在线 | 999久久久免费精品国产 | 亚洲乱码国产乱码精品天美传媒 | 999精品在线观看 | 毛片动态图 | 亚洲爱 | 人妻 日韩精品 中文字幕 | 久久综合久色欧美综合狠狠 | 国产福利专区 | 手机在线成人 | 九色91popny蝌蚪新疆 | 亚洲一区二区三区网站 | 爱射综合| 色一区二区 | 日韩有码在线观看 |