How to use PostgreSQL#39;s quot;INSERT...ON CONFLICTquot; (UPSERT) feature with flask_sqlalchemy?(如何将PostgreSQL39;squot;插入.与flask_sqlalChemy一起使用冲突(UPSERT)功能?)
本文介绍了如何将PostgreSQL&39;s";插入.与flask_sqlalChemy一起使用冲突(UPSERT)功能?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
INSERT
语句中的PostgreSQLON CONFLICT
子句提供"upsert"功能(即更新现有记录,或者如果不存在这样的记录,则插入新记录)。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
完全包裹和遮挡。
flask_sqlalchemy
并创建我自己的会话?如果我这样做,如何确保不会发生冲突?
推荐答案
原来您可以在db.session
上执行较低级别的语句。因此,解决方案如下所示:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy.dialects.postgresql import insert as pg_insert
app = Flask(__name__)
db = SQLAlchemy(app)
class MyTable(db.Model):
id = db.Column(UUID, primary_key=True)
data = db.Column(db.String)
def __init__(self, _id, *args, **kwargs):
self.id = _id
self.data = kwargs['data']
def as_dict(self):
return {'id': self.id, 'data': self.data}
def props_dict(self):
d = self.as_dict()
d.pop('id')
return d
relation = MyTable(id=1, data='foo')
statement = pg_insert(MyTable).
values(**relation.as_dict()).
on_conflict_do_update(constraint='id',
set_=relation.props_dict())
db.session.execute(statement)
db.session.commit()
我的模型类中的as_dict()
和props_dict()
方法允许我使用构造函数从传入的HTTP请求中过滤移出不需要的属性。
这篇关于如何将PostgreSQL&39;s";插入.与flask_sqlalChemy一起使用冲突(UPSERT)功能?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
沃梦达教程
本文标题为:如何将PostgreSQL&39;s";插入.与flask_sqlalChemy一起使用冲突(UPSERT)功能?
基础教程推荐
猜你喜欢
- 使用 Google App Engine (Python) 将文件上传到 Google Cloud Storage 2022-01-01
- 使用Python匹配Stata加权xtil命令的确定方法? 2022-01-01
- 症状类型错误:无法确定关系的真值 2022-01-01
- 使 Python 脚本在 Windows 上运行而不指定“.py";延期 2022-01-01
- Python 的 List 是如何实现的? 2022-01-01
- 如何在 Python 中检测文件是否为二进制(非文本)文 2022-01-01
- 如何在Python中绘制多元函数? 2022-01-01
- 合并具有多索引的两个数据帧 2022-01-01
- 哪些 Python 包提供独立的事件系统? 2022-01-01
- 将 YAML 文件转换为 python dict 2022-01-01