本文主要试图使用占位符或其他方法来动态更新字段,达到对多个字段进行批量更新。但是在摸索一段时间后仍没能解决,倒是了解了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连接mysql的pymysql包,如何通过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三个字段信息

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库的使用与问题