相关文章推荐
憨厚的芒果  ·  typescript 怎么合并 ...·  1 年前    · 
有情有义的卤蛋  ·  Qt ...·  1 年前    · 
严肃的鼠标  ·  inno setup ...·  2 年前    · 

本文主要试图使用占位符或其他方法来动态更新字段,达到对多个字段进行批量更新。但是在摸索一段时间后仍没能解决,倒是了解了sql防注入的风险。

我们知道,pymysql批量更新是使用executemany(sql,data)。 当想对多个字段进行批量更新,自然而然想到用这样的形式。

data = [['字段1',123,'admin'],['字段2',234,'admin']]
sql = 'update user_table set %s=%s where username =%s'
cur.executemany(sql,data)

这样写报错。

mysql中的字段是用 ` (tab键上方的引号)括起来的。用占位符传值这种形式,会自动带上单引号',且pymysql 的占位符并不是 python 的通用占位符。

如果是只需要传值,那么这里的sql是正常的。但如果是表名和key,sql会变成这样:

sql="update "table" set "key"="value"

解决办法:

一、对于批量更新语句

暂时没有找到可以使用 executemany(sql,data) 进行批量更新的办法。

1- 提前将sql语句拼接好。

sql="update" + table + " set " + key + "=%s" # 注意set前后的空格
cursor.execute(sql, (value,))
# cursor.execute(sql, value)

2- 使用%s作为字段占位符,带(参数)传值,有sql注入风险

# 对表名和字段使用了%s占位符,此种写法成功执行了sql语句。
sql = 'update %s set %s="%s"' %(表名,字段名,值)
cursor.execute(sql)
# 以下几种对表名和字段使用了%s占位符,在执行sql语句时均报错
# updata = [['字段1','字段1值','用户名'],['字段12','字段2值','用户名']]
# sql = 'update user_table set %s=%s where username =%s'
# cur.executemany(sql,updata)
# cur.execute(sql,updata[0])
# cur.execute(sql,(col_id,cnt,username)) #col_id = '字段1', cnt = '字段1值'
conn.commit()

3- 防sql注入

a、字典传值

#1- 使用字典传值,不能传表名和字段名
# 以下对字段名进行传值,报错
# sql = 'update user_table set %(col_id)s=%(cnt)s where username =%(name)s'
# data = {'col_id':'counts','cnt':cnt,'name':username}
# cur.execute(sql,data)
# conn.commit()
sql = 'update user_table set counts =%(cnt)s where username =%(name)s'
data = {'cnt':cnt,'name':username}
cur.execute(sql,data)
conn.commit()

b、,逗号传值,不要用%

sql = "insert into 表名 (字段名1,字段名2,字段名3,) values (%s,%s,%s)"
cur.execute(sql, (val1,val2,val3))
# sql = "insert into 表名 (字段名1,字段名2,字段名3,) values (%s,%s,%s)" %(val1,val2,val3)
# cur.execute(sql) # 有sql注入风险

4- {}.format形式作为表名或字段名占位 

二、对于批量插入语句

用逗号连接将字段列表转成字符串

field_names = ','.join(field_names)
                    在往数据库更新数据时,想要对多个字段进行批量更新。我们知道,pymysql批量更新是使用executemany(sql,data)。 当想对多个字段进行批量更新,自然而然想到用这样的形式。data = [['字段1',123,'admin'],['字段2',234,'admin']]sql = 'update user_table set %s=%s where username =%s'cur.executemany(sql,data)这样写报错。mysql中的字段是用 .
				
在笔者之前的博文中,已介绍了用python连接与mysql数据库的知识。包括如何安装python连接mysqlpymysql包,如何通过cusor语句将python与mysql连接起来,以及如何用python查询数据库等等。 传送门:用python连接与查询mysql数据库 今天,再来说说如何用python写入数据和添加数据到mysql。 一、用python将数据写入mysql 例子:现有一个e...
sql中 %s 变量模糊查询的问题 SELECT `id`,`cityarea_name` FROM `ymm_map` WHERE cityarea_name like '%%%s%%' # 此处 %s 是一个变量 查询出重复记录 select * from 数据表 WHERE ... 举例说明: 需要在数据库中插入moviename,stars,time三个字段信息 ![数据库样式](https://img-blog.csdnimg.cn/20190809095651264.png) db = pymysql.connect('127.0.0.1','root','123456','zwl',charset = 'utf8')
Python MySQL数据库的连接以及基本操作一、数据库的连接1、直接连接2、连接池连接二、 数据库的基本操作1、执行函数2、创建数据表3、删除表4、插入函数6、删除函数7、状态判断函数8、修改函数查询函数三、全部代码 一、数据库的连接 这里主要介绍python中直接连接MySQL数据库和通过连接池连接数据库的两种连接方式 1、直接连接 直接连接是一种十分基础的连接方式,代码十分简单。DBHOS...
pwd = input('请输入密码:') # 1.连接 conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', password='', db='db8', charset='utf8')
使用MySQLdb连接数据库执行sql语句时,有以下几种传递参数的方法。 1.不传递参数 conn = MySQLdb.connect(user="root",passwd="123456",host="192.168.101.23",db="cmdb") orange_id = 98 sql = "select * from orange where id=%s" % orange_id field = '-' sql_talk="UPDATE cnp.Test set a='' where b='%s'" cursor.execute(sql_talk % field) db.commit() 多个传参用{0}占位符: field = '-' a = 'code' sql_talk="UPDATE cnp.Test set {0}='' where business_registration_code='{1}'".format(a,fi
(1)关系型数据库 即数据之间是有关系的,比如学生管理系统中的学生信息,有姓名,性别等等信息。关系型数据库一般为二维表格。 常见数据库MySQL、Oracle、SQL server等等 (2)非关系型数据库 又称NoSQL(Not Only SQL),数据是非关联型的,强调key+value存储。 以下主要是关系型数据库 3.数据库管理系统 数据库管理系统(DBMS)是管理数据
pymysql 是 Python 中用于连接和操作 MySQL 数据库的库。占位符是一种在 SQL 查询中使用的特殊标记,用于将查询中的参数与实际值分开,以提高查询的安全性和性能。在 pymysql 中,可以使用占位符来执行带有参数的 SQL 查询。 常用的占位符有两种形式: 1. 问号占位符(?):使用问号作为占位符,查询参数按照顺序传递给 execute() 方法。示例代码如下: ```python import pymysql # 连接数据库 conn = pymysql.connect(host='localhost', user='your_username', password='your_password', db='your_database') # 创建游标对象 cur = conn.cursor() # 执行带有占位符的 SQL 查询 sql = "SELECT * FROM your_table WHERE id = ?" cur.execute(sql, (1,)) # 注意参数传递的方式,需要将参数放在一个元组中 # 获取查询结果 result = cur.fetchall() # 关闭游标和连接 cur.close() conn.close() 2. 命名占位符(:name):使用冒号加参数名的形式作为占位符,查询参数通过字典形式传递给 execute() 方法。示例代码如下: ```python import pymysql # 连接数据库 conn = pymysql.connect(host='localhost', user='your_username', password='your_password', db='your_database') # 创建游标对象 cur = conn.cursor() # 执行带有占位符的 SQL 查询 sql = "SELECT * FROM your_table WHERE id = :id" cur.execute(sql, {'id': 1}) # 注意参数传递的方式,使用字典形式传递参数 # 获取查询结果 result = cur.fetchall() # 关闭游标和连接 cur.close() conn.close() 这些示例演示了在 pymysql 中使用占位符执行 SQL 查询的常用方法。占位符的使用可以有效防止 SQL 注入攻击,并提高查询的性能。
UnicodeDecodeError: ‘utf-8‘ codec can‘t decode byte 0xff in position 0: invalid start byte PyQt5开发问题及技巧合集 python 配置文件configparser库的使用与问题