首页 > 数据库 >sqlalchemy 实现 mysql INSERT INTO...ON DUPLICATE KEY UPDATE语法

sqlalchemy 实现 mysql INSERT INTO...ON DUPLICATE KEY UPDATE语法

时间:2023-12-11 10:57:19浏览次数:41  
标签:INSERT sqlalchemy insert DUPLICATE stmt duplicate key ...

1. 前言

myql的INSERT INTO...ON DUPLICATE KEY UPDATE语句,简单点来说,就是如果记录不存在,则插入,如果记录存在,则更新。

那怎么判断记录存在否?—— 主键、唯一键。

那不是可以使用replace语句吗?—— 原理上可以,但是sqlalchemy orm中的的实现,是使用merge语法,这个语法有一个限制,就是判断是否已经存在记录的时候,只检查主键,不检查唯一键。

因此使用sqlalchemy中对INSERT INTO...ON DUPLICATE KEY UPDATE的实现。

2. 实现

官网给的例子[1]:

from sqlalchemy.dialects.mysql import insert

insert_stmt = insert(my_table).values(
     id='some_existing_id',
     data='inserted value')
 
on_duplicate_key_stmt = insert_stmt.on_duplicate_key_update(
     data=insert_stmt.inserted.data,
     status='U'
)
print(on_duplicate_key_stmt)
conn.execute(on_duplicate_key_stmt)

是不是很迷,整体来说sqlalchemy给的文档都比较迷,解释一下:

  • insert(my_table):table表示你orm中定义的关于表的model类,譬如你有个test的表,里面只有四个字段,id,a,b,c,你orm中定义的model类如下:
 1 from sqlalchemy.ext.declarative import declarative_base
 2 Base = declarative_base()
 3 
 4 class Test(Base):
 5     __tablename__ = "test"
 6     id = Column(Integer, primary_key=True, index=True)
 7     a = Column(Integer) 
 8     b = Column(String(36)) 
 9     c = Column(String(50)) 
10 
11     __table_args__ = (
12         UniqueConstraint("b", "c", name='uni_bc'),
13     )

可以看到,主键为id,另外b_c构成一个联合唯一键。

  • insert(my_table).values:后面的参数表示插入的数据(key value),如
insert_stmt = insert(Test).values(
     a=1,
     b='newb',
     c='newc')
  • insert_stmt.on_duplicate_key_update表示如果记录存在,需要更新那些字段,键值对的规则如上:
on_duplicate_key_stmt = insert_stmt.on_duplicate_key_update(
     c='newerc')
  • conn.execute(on_duplicate_key_stmt):conn为你的db 连接会话。

当然,大部分时候,你不想手动指定每个字段,而是将所有需要插入的字段都放在dict中,如果不存在则插入,存在则更新,则直接使用Python的解包语法糖即可:

new_record = {
    a = 1, 
    b = 'newb',
    c = 'newc'
}

insert_stmt = insert(Test).values(**new_record)

on_duplicate_key_stmt = insert_stmt.on_duplicate_key_update(**new_record)

conn.execute(on_duplicate_key_stmt)

基本就是实现replace into的效果了,如果有其他方法的朋友请不吝留言。

3. 参考

[1] INSERT…ON DUPLICATE KEY UPDATE (Upsert)

(完)

标签:INSERT,sqlalchemy,insert,DUPLICATE,stmt,duplicate,key,...
From: https://www.cnblogs.com/harrymore/p/17893865.html

相关文章

  • 是不是太胖了 最佳情侣身高差 求1+2+...+n的和
    7-4是不是太胖了据说一个人的标准体重应该是其身高(单位:厘米)减去100、再乘以0.9所得到的公斤数。已知市斤的数值是公斤数值的两倍。现给定某人身高,请你计算其标准体重应该是多少?(顺便也悄悄给自己算一下吧……)输入格式:输入第一行给出一个正整数H(100 < H ≤ 300),为某人身......
  • ...
             ......
  • 卸载节点Clusterware执行rootcrs.pl时报错"Compilation failed in require..."
    问题描述:卸载节点Clusterware执行rootcrs.pl时报错"Compilationfailedinrequire...",如下所示:系统:rhel7.364位数据库:oracle11.2.0.4rac3节点1、异常重现[root@rac3install]#./rootcrs.pl-deconfig-forceCan'tlocateEnv.pmin@INC(@INCcontains:/usr/local/li......
  • VECTOR INSERT()
    #include<iostream>#include<vector>usingnamespacestd;intmain(){vector<int>a(20);a.push_back(1);intarr[]={1,2,3,4,5};vector<int>b(arr,arr+sizeof(arr)/sizeof(int));intar[]={7,8,9,10,11};vecto......
  • 5秒成为AI产业顾问、营销BI轻松搭建......一封来自星河社区5周年产业特辑的信
    亲爱的星河社区企业伙伴:这一年,大模型技术为产业应用带来了范式的变革。有幸的是,我们与众多生态企业一起,共同经历了这一在时代中留下烙印的历史进程。自星河社区发布了大模型开发工具ERNIEBotSDK,我们与紧跟创新趋势的企业伙伴联合更为紧密。我们一起通过分享最新的AI应用趋势、探......
  • 大白话说Python+Flask入门(六)Flask SQLAlchemy操作mysql数据库
    写在前面这篇文章被搁置真的太久了,不知不觉拖到了周三了,当然,也算跟falsk系列说再见的时候,真没什么好神秘的,就是个数据库操作,就大家都知道的CRUD吧。FlaskSQLAlchemy的使用1、FlaskSQLAlchemy简介FlaskSQLAlchemy是基于Flaskweb框架和SQLAlchemyORM(对象关系映射)的工具......
  • C. Insert and Equalize
    原题链接导论1.数列末尾插入一个没有在数列中出现过的数,然后对数列中的每个数加上x的若干倍数(其中的x对于每个数而言均相同),使得数列中的所有数均相等2.由导论1可以推出,x一定是\(|a[i]-a[j]|(1\leqi,j\leqn)\)的最大公约数3.导论2的时间复杂度显然太高了,因此猜想\(gcd(|a[i......
  • Flask-SQLALchemy
    SQLALchemyorm,对象-关系映射,主要实现模型对象到关系型数据库的映射,orm提供一种面向对象的数据库的方式给开发者,不需要编写原生的sql语句也能操作数据库,实现了业务代码与底层数据的解耦优势:1.对数据库操作转为对类/对象的属性和方法的操作,字段--对象数据,sql关键字--操作方法......
  • perl:mysql binlog iud (insert、update、delete)分析 小脚本:实用程序
    1#!/usr/bin/perl2#utf-834usestrict;5usePOSIX;6useTime::HiResqw/sleeptime/;78$|=1;910my$line='#-----------------------------------------------------------------------';11my$debug=0;1213##------------......
  • 【Python/数据库】SQLAlchemy基础操作
    一、SQLAlchemy——创建表#ORM#1.Class-Obj#2.创建数据库引擎#3.将所有的Class序列化为数据表#4.ORM操作-CRUD(增删改查操作的简称)1.创建一个class#create_table.pyfromsqlalchemy.ext.declarativeimportdeclarative_baseBase=declarative_base......