如何使用 SqlAlchemy 进行更新插入?

2023-12-08

我有一条记录,如果它不存在,我希望存在于数据库中,如果它已经存在(主键存在),我希望将字段更新到当前状态。这通常被称为upsert.

以下不完整的代码片段演示了可行的方法,但它似乎过于笨拙(特别是如果有更多列)。更好/最好的方法是什么?

Base = declarative_base()
class Template(Base):
    __tablename__ = 'templates'
    id = Column(Integer, primary_key = True)
    name = Column(String(80), unique = True, index = True)
    template = Column(String(80), unique = True)
    description = Column(String(200))
    def __init__(self, Name, Template, Desc):
        self.name = Name
        self.template = Template
        self.description = Desc

def UpsertDefaultTemplate():
    sess = Session()
    desired_default = Template("default", "AABBCC", "This is the default template")
    try:
        q = sess.query(Template).filter_by(name = desiredDefault.name)
        existing_default = q.one()
    except sqlalchemy.orm.exc.NoResultFound:
        #default does not exist yet, so add it...
        sess.add(desired_default)
    else:
        #default already exists.  Make sure the values are what we want...
        assert isinstance(existing_default, Template)
        existing_default.name = desired_default.name
        existing_default.template = desired_default.template
        existing_default.description = desired_default.description
    sess.flush()

有没有更好或更简洁的方法来做到这一点?像这样的事情会很棒:

sess.upsert_this(desired_default, unique_key = "name")

虽然unique_keykwarg 显然是不必要的(ORM 应该能够轻松地解决这个问题)我添加它只是因为 SQLAlchemy 倾向于只使用主键。例如:我一直在考虑是否会话合并是适用的,但这仅适用于主键,在本例中是一个自动增量 id,对于此目的来说并不是很有用。

一个示例用例就是启动可能已升级其默认预期数据的服务器应用程序。即:此更新插入没有并发问题。


SQLAlchemy 支持ON CONFLICT有两种方法on_conflict_do_update() and on_conflict_do_nothing().

复制自文档:

from sqlalchemy.dialects.postgresql import insert

stmt = insert(my_table).values(user_email='[email protected]', data='inserted data')
stmt = stmt.on_conflict_do_update(
    index_elements=[my_table.c.user_email],
    index_where=my_table.c.user_email.like('%@gmail.com'),
    set_=dict(data=stmt.excluded.data)
)
conn.execute(stmt)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 SqlAlchemy 进行更新插入? 的相关文章

随机推荐

  • Struts 2 中的下拉菜单

    我有一张带有键值对的地图 我想在下拉列表中显示键 并将值发送到服务器以识别所选内容 我使用的是Struts2 我尝试把Map in
  • 使用过滤器更改 UITextView 链接的颜色?

    UITextView 上检测到的链接始终为蓝色 没有办法直接改变这一点 但是我可以叠加某种将蓝色变为红色的滤镜吗 实际上有一种方法可以做到这一点使用私有 API A UITextView有一个 单个 类子视图UIWebDocumentVie
  • 如何比较两个 char[] 数组是否相等?

    现在我有两个char数组 foo1 and foo2 当我将它们转换为字符串并输出到控制台时 它们都显示为bar 我知道我可以做这样的事情 int g for int i 0 i
  • 如何添加到 ASP.NET HttpRequest 客户端可用的密码套件?

    当我的 ASP NET 网站在 Windows 7 机器上运行时 它可以很好地连接 以编程方式作为 客户端 到另一台 Windows 7 计算机上的 SSL 加密服务 服务器 但如果我的网站位于生产环境 Windows Server 200
  • htaccess和重写

    我刚刚在我的网站上创建了一个子域 主要是因为我想要一个特定的地址 可以说我的网站是 http website com我的子域是http sub website com其主文件夹位于 home username public html sub
  • 在 C# 中将像素数组转换为图像

    我有一个数组int我的 C 程序中存在像素 我想将其转换为图像 问题是我正在将程序的 Java 源代码转换为等效的 C 代码 在java中 该行读取将int像素数组显示到图像中 Image output createImage new Me
  • 无需内联汇编即可访问标志?

    我在 C 中有以下方法 它需要两个 16 位短整型 将两个整数相加 如果设置了进位标志 则结果加 1 对最终结果中的所有位取反 NOT 返回结果 short declspec naked getchecksum short s1 short
  • setWindowFlag(Qt::Dialog | Qt::WindowStaysOnTopHint) 在 Centos 上不起作用

    我正在打开一个表单窗口 并希望无论它是否聚焦 都始终将其保留在顶部 我正在使用此功能setWindowFlags Qt Dialog Qt WindowStaysOnTopHint QT 的它在 Mac 上工作正常 正如我所希望的 但是当我
  • 通过 TNS 连接到 Oracle 无法正常工作

    我有一个 Spring Boot 应用程序 当它以经典方式连接到 Oracle 实例时 它可以顺利运行 jdbc oracle thin
  • 您的安全设置阻止了应用程序使用过时或过期的 Java 版本运行

    问候 我遇到了一个 Java 错误 这实际上给我带来了一场噩梦 它说 应用被安全设置阻挡了 您的安全设置已阻止应用程序使用过时或过期的 Java 版本运行 Java 版本 1 7 25 推荐用于我的工作 我认为不是旧版本 我已经执行的解决方
  • 坚固耐用。 (vcovHC) 在 R 中用 texreg 显示

    我正在使用 plm 包进行一些回归 然后如果需要 我还可以获得异方差一致系数 以下是我运行的命令 library plm data Produc package plm zz lt plm log gsp log pcap log pc l
  • 从 Ensembl 基因 ID 转换为不同的标识符

    我继承了 Canis Lupus 狗 的 RNAseq 输出数据集 我有 Ensembl 格式的基因标识符 具体来说它们看起来像这样 ENSCAFT00000001452 3 我正在尝试使用 bioMaRt 将它们转换为更常见的 ID 需要
  • Oracle 中的递归

    我在预言机中有下表 Parent arg1 arg2 我想要关系父级的传递闭包 也就是我想要下表 Ancestor arg1 arg2 这在 Oracle 中怎么可能呢 我正在做以下事情 WITH Ancestor arg1 arg2 AS
  • 如何创建全局可访问的变量?

    我正在尝试创建一个可以在任何地方工作的变量 而不仅仅是在一个函数中 我该怎么做呢 我已经搜索了大约 1 个小时 但找不到它 我试过这个 noneTxt document innerHTML Nothing is playing functi
  • Azure 云服务:在网站(Web 角色)实例中进行缩放,在 iis 准备就绪之前接收请求

    描述 我在云服务中托管了一个 Web 角色 该服务是一个网站 我们通过自定义监控 辅助角色 来处理可预测的负载峰值 该监控将根据预测的负载配置文件定期缩小或缩小 那部分正在工作 Issue 通过监控安装网站的新实例后 我们刚刚遇到一个用户的
  • 计算 Google Maps API v3 中的折线(路线)和标记之间的距离

    有没有方便的方法来计算折线 由 Google Directions 生成的路线 和不在该折线上的标记之间的直接 最短 距离 我发现的唯一方法是循环遍历Polyline getPath 手动计算顶点来计算最短距离 但这似乎有点苛刻 var p
  • 如何将多个触摸操作附加到单个列表项?

    我正在使用以下列表布局items已关联的comments 的数量comments由右侧的框表示 目前 我正在使用onListItemClick处理程序启动另一个details view public class CustomListFrag
  • 如何使用 XSLT 2.0 和 REGEX(没有 \b 单词边界)在文本中查找单词?

    我正在尝试使用 REGEX 扫描一串单词并在 XSLT 2 0 样式表中查找特定单词 不区分大小写 的存在 我有一个单词列表 我希望迭代并确定它们是否存在于给定字符串中 我想匹配给定文本中任何位置的单词 但是我不想匹配within a wo
  • 使用“purrr”从列表列表中提取数据到自己的“data.frame”中

    代表性样本数据 列表列表 l lt list structure list a 1 54676469632688 b s c T d structure list id 5L label Utah link Asia Anadyr scor
  • 如何使用 SqlAlchemy 进行更新插入?

    我有一条记录 如果它不存在 我希望存在于数据库中 如果它已经存在 主键存在 我希望将字段更新到当前状态 这通常被称为upsert 以下不完整的代码片段演示了可行的方法 但它似乎过于笨拙 特别是如果有更多列 更好 最好的方法是什么 Base