Python3 使用 PyMySQL 将变量安全写入 SQL 语句的方法

闻溪
闻溪
发布时间:2026-10-12| 1人浏览过
原创

本文介绍在 Python3 中如何利用 PyMySQL 库将变量安全地写入 SQL 语句。通过演示使用占位符 %s 和元组传递参数,有效防止 SQL 注入。内容涵盖基本的 SELECT 查询、动态构建 INSERT 语句以及处理 ON DUPLICATE KEY UPDATE 的复杂场景,提供完整的代码示例与操作逻辑。

基础连接与查询

在使用 Python 操作 MySQL 数据库前,首先需要建立连接并获取游标对象。以下代码展示了如何连接本地数据库并执行简单的 SELECT 查询。注意,此处仅用于展示连接流程,未涉及变量写入。

import pymysql
db = pymysql.connect(host='localhost', user='root', password='123456', port=3306, db='spiders')
cursor = db.cursor()
sql = 'select * from students;'
cursor.execute(sql)
cursor.close()
db.close()

动态插入数据:参数化查询

将变量写入 SQL 语句时,核心原则是使用占位符(如 %s)而非直接拼接字符串,以避免 SQL 注入风险。PyMySQL 支持通过 cursor.execute(sql, params) 的方式传递参数,其中 params 通常为元组或字典。

以下示例演示如何动态构建 INSERT 语句。通过获取字典的键作为列名,生成对应的占位符,最后将字典的值转换为元组传递给执行方法。

import pymysql
db = pymysql.connect(host='localhost',user='root', password='123456', port=3306, db='spiders')
data = {
  'id': '20180606',
  'name': 'Lily',
  'age': 20
}
table = 'students'
keys = ', '.join(data.keys())
values = ', '.join(['%s'] * len(data))
sql = 'INSERT INTO {table}({keys}) VALUES ({values})'.format(table=table, keys=keys, values=values)
try:
  cursor.execute(sql, tuple(data.values()))
  print('Successful')
  db.commit()
except:
  print('Failed')
  db.rollback()
cursor.close()
db.close()

在此过程中,keys 变量由字典键名拼接而成,values 变量由与数据量相同的 %s 拼接而成。执行时,tuple(data.values()) 确保数据按顺序绑定到占位符。

处理冲突更新:ON DUPLICATE KEY UPDATE

当需要实现“存在则更新,不存在则插入”的逻辑时,可使用 MySQL 的 ON DUPLICATE KEY UPDATE 语法。这需要动态生成更新字段的 SQL 片段,并确保参数传递的数量与占位符数量匹配。

import pymysql
db = pymysql.connect(host='localhost',user='root', password='123456', port=3306, db='spiders')
data = {
  'id': '20180606',
  'name': 'Lily',
  'age': 25
}
table = 'students'
keys = ', '.join(data.keys())
values = ', '.join(['%s'] * len(data))
sql = 'INSERT INTO {table}({keys}) VALUES ({values}) ON DUPLICATE KEY UPDATE'.format(table=table, keys=keys, values=values)
update = ','.join([" {key} = %s".format(key=key) for key in data])
sql += update
try:
  cursor.execute(sql, tuple(data.values())*2)
  print('Successful')
  db.commit()
except:
  print('Failed')
  db.rollback()
cursor.close()
db.close()

该示例中,update 变量生成了类似 name = %s, age = %s 的字符串。由于插入部分和更新部分都使用了占位符,因此传递给 execute 的参数元组需要重复两次(tuple(data.values())*2),以匹配所有占位符的数量。

注意事项

1. 安全性:始终使用参数化查询(%s)传递用户输入或变量,严禁直接拼接字符串构建 SQL,以防 SQL 注入攻击。
2. 事务处理:在执行写操作(INSERT/UPDATE/DELETE)时,务必使用 db.commit() 提交事务,并在发生异常时使用 db.rollback() 回滚,以保证数据一致性。
3. 资源释放:操作完成后,记得关闭游标和数据库连接,以释放服务器资源。

以上就是 Python3 将变量写入 SQL 语句的详细内容,更多关于 Python 数据库操作、PyMySQL 使用技巧的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。