【发布时间】:2017-05-28 22:01:10
【问题描述】:
INSERT 语句中的 PostgreSQL ON CONFLICT 子句提供“更新插入”功能(即更新现有记录,或在不存在此类记录时插入新记录)。 SQLAlchemy 通过 PostgreSQL 方言的 Insert 对象上的 on_conflict_do_nothing 和 on_conflict_do_update 方法支持此功能(如 here 所述):
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 并创建自己的会话?如果这样做,如何确保没有冲突?
【问题讨论】:
标签: python postgresql flask sqlalchemy flask-sqlalchemy