2022-08-22 Python 任意字典生成 SQL(update 语句)

https://blog.csdn.net/Yellow_python/article/details/82216982


table_name = 'student'
d = {'name': 'ArYe', 'age': 15} # 更新的字段及对应值
t = ('id', 307) # 更新所需条件

自动构造update语句

sentence = 'UPDATE %s SET ' % table_name + ','.join(['%s=%r' % (k, d[k]) for k in d]) + ' WHERE %s=%r;' % (t[0], t[1])

打印

print(sentence)

UPDATE student SET name=‘ArYe’,age=15 WHERE id=307;

table_name = 'student'
d1 = {'name': 'ArYe', 'age': 15} # 更新的字段及对应值
d2 = {'sex': 'girl', 'id': 307} # 更新所需条件

自动构造update语句

sentence1 = 'UPDATE %s SET ' % table_name
sentence2 = ','.join(['%s=%r' % (k, d1[k]) for k in d1])
sentence3 = ' WHERE '
sentence4 = ' AND '.join(['%s=%r' % (k, d2[k]) for k in d2])
sentence5 = sentence1 + sentence2 + sentence3 + sentence4 + ';'

打印

print(sentence1)
print(sentence2)
print(sentence3)
print(sentence4)
print(sentence5)

打印结果
UPDATE student SET
name=‘ArYe’,age=15
WHERE
sex=‘girl’ and id=307
UPDATE student SET name=‘ArYe’,age=15 WHERE sex=‘girl’ AND id=307;
备注
应用场景
爬虫数据写入数据库
优点:
通用性好,直接复制可用,不用费脑写sql
知识补充
任意字典生成insert语句
知识进阶
字典写入数据库


https://blog.csdn.net/weixin_42509766/article/details/118817601
MySQL如何通过字典表update,如何使用python更新mysql,其中字段和条目来自字典?...

I am trying to create a re-usable mysql statement for updating from a dictionary where the keys are the database fields and the data to go into that field is the value associated with it in the dictionary. This was easy when creating a function for inserting into mysql because it just involved two lists. Now, I need to break apart the lists.

Here is what I have to work with.

fields = self.dictionary.keys()

vals = self.dictionary.values()

stmt = "UPDATE TABLE table_name SET %s = '%s'" %(.join(fields), .join(vals))"

This outputs a statement like:

UPDATE TABLE table_name SET column1, column2 = ('value1','value2')

I need it to output to standard format for updating a table like:

UPDATE table_name SET column1=value1, column2=value2

解决方案

You don't want to be putting literal values in using string interpolation - SQL injection attacks are not a Good Thing(tm). Instead, you use the placeholder syntax relevant for your database (I think MySQL's is '%s').

Note: I'm using .format here, change to use % if you want, but escape any %'s

d = {'col1': 'val1', 'col2': 'val2'}

sql = 'UPDATE table SET {}'.format(', '.join('{}=%s'.format(k) for k in d))

print sql

'UPDATE table SET col2=%s, col1=%s'

Assuming cur is a DB cursor the correct way to perform the query is:

cur.execute(sql, d.values())

This works because although the ordering of a dictionary is effectively arbitrary order, the order of keys/values of a dict will be consistent such that dict(zip(d.keys(), d.values())) == d.


https://www.modb.pro/db/245152

根据传入的字典,生成MySQL中updqte..set ...where
的更新sql,解决日常开发中不断写sql并频繁出错的烦恼!

提示:
根据返回的结果调用 pymysql.cursor.execute(query, args)
插入即可

注意:
传入的字典key,是MySQL表中对应的字段名。


def update_where_sql_data(table_name: str, update_content: dict, where_content: dict):
"""
根据传入的字典生成 UPDATE...SET...WHERE条件的sql
字典的key,是MySQL表中对应的字段名
:param table_name: 保存的表名
:param update_content: 需要更新的数据 dict
:param where_content: 更新的条件 dict
:return: update_sql:<str> 更新的update sql, dat:<tuple>保存的内容
"""

# sql 生成
sql = 'UPDATE `{}` SET {} WHERE {};'
update_content_sql = ''.join(['`{}`=%s, '.format(val) for val in list(update_content.keys())])[:-2]
where_content_sql = ''.join(['`{}`=%s, '.format(val) for val in list(where_content.keys())])[:-2]
update_sql = sql.format(table_name, update_content_sql, where_content_sql)

# 保存的内容生成
update_data_li = list(update_content.values())
where_data_li = list(where_content.values())
data = tuple(update_data_li + where_data_li)

# print(update_sql)
# print(data)
return update_sql, data

if name == 'main':
# 调用参考
__update_content = {"name": "hello world"}
__where_content = {"id": 1}
sql, data = update_where_sql_data('your_table_name', update_content=__update_content, where_content=__where_content)
print(sql)
print(data)
# 执行 pymysql 插入即可, 此处省略
# pymysql.cursor.execute(sql, data)
# pymysql.conn.commit()

输出结果:
UPDATE your_table_name SET name=%s WHERE id=%s;
('hello world', 1)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,366评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,521评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,689评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,925评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,942评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,727评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,447评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,349评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,820评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,990评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,127评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,812评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,471评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,017评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,142评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,388评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,066评论 2 355

推荐阅读更多精彩内容

  • 语 句 功 能 数据操作 SELECT——从数据库表中检索数据行和列INSERT——向数据库表添加新数据行DELE...
    戰敭阅读 5,097评论 0 53
  • https://blog.csdn.net/tzyyy1/article/details/93510663[htt...
    netppp阅读 2,138评论 0 1
  • 元组 1、什么是元组? '''使用()将元素括起来,多个元素之间用,隔开a.可以储存多个数据的容器、不可变,有序的...
    Heyjoky阅读 322评论 0 0
  • 一、元祖 1.什么是元祖 """使用()将多个元素括起来,多个元素之间用逗号隔开a.容器,可以同时存储多个数据,不...
    大漠判官1阅读 327评论 0 0
  • 增、删、改、查 1.修改列表元素 通过下标获取元素,然后重新赋值: 列表名[下标] = 新的值注意: 这儿的下标不...
    zzzsssr阅读 346评论 0 3