INSERT
語句中的PostgreSQL ON CONFLICT
子句提供了「upsert」功能(即更新現有記錄,或者如果不存在此類記錄,則插入新記錄)。此功能在SQLAlchemy中通過PostgreSQL方言的Insert
對象的on_conflict_do_nothing
和on_conflict_do_update
方法(如描述here)支持:如何在flask_sqlalchemy中使用PostgreSQL的「INSERT ... ON CONFLICT」(UPSERT)功能?
from sqlalchemy.dialects.postgresql import insert
insert_stmt = insert(my_table).values(
id='some_existing_id',
data='inserted value'
)
do_nothing_stmt = insert_stmt.on_conflict_do_nothing(
index_elements=['id']
)
conn.execute(do_nothing_stmt)
do_update_stmt = insert_stmt.on_conflict_do_update(
constraint='pk_my_table',
set_=dict(data='updated value')
)
conn.execute(do_update_stmt)
我使用flask_sqlalchemy
,它爲您管理的SQLAlchemy的發動機,會話和連接。將元素添加到數據庫中,我創建了我的模型的實例,將其添加到數據庫會話,然後調用commit,這樣的事情:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
db = SQLAlchemy(app)
class MyTable(db.Model):
id = db.Column(UUID, primary_key=True)
data = db.Column(db.String)
relation = MyTable(id=1, data='foo')
db.session.add(relation)
db.session.commit()
所以Insert
對象是完全包裹和flask_sqlalchemy
模糊。
如何訪問PostgreSQL特定的方言方法來執行upsert?我是否需要繞過flask_sqlalchemy
並創建我自己的會話?如果我這樣做,我怎麼能確保沒有衝突?