【Python】SQLite3的execute函数参数详细说明

本文介绍了在Python中使用SQLite3库进行数据更新时的正确方法,强调了避免字符串拼接以防止SQL注入攻击的重要性。推荐使用参数替换方法,包括问号占位符(qmarkstyle)和命名占位符(namedstyle)。示例代码展示了如何插入和查询数据,强调了参数序列化的要求,并指出使用不可变元组确保安全性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Python使用SQLite3在使用execute方法执行数据更新时,如何传递要更新的数据。

搜索了挺久,很多博客文章人云亦云,抄来抄去,没有找到有价值的东西。

用Bing搜到官方文档。转译如下。

官方原文点击浏览https://docs.python.org/3/library/sqlite3.html


SQL 操作通常需要使用Python变量保存的值。然而,要知道,使用Python字符串拼接操作来组装SQL语言,是非常危险的,很容易受到SQL注入攻击。

# 千万不要这样做,不安全!
symbol = 'RHAT'
cur.execute("SELECT * FROM stocks WHERE symbol = '%s'" % symbol)

相反,应该使用 数据库管理软件 如 SQLite 官方提供的API 中的参数替换方法。

为了在查询语句中使用变量,可以在查询语句的字符串中使用占位符 placeholder,用来代替实际的值,然后将这些实际值组成 元组 tuple【注意:是python的tuple】 作为 游标 cursor 的 execute() 的第二个参数来实现。

有两种占位符方式。

一种是用 ? 作为占位符(qmark style),另一种是 命名占位符(named style)。

问号占位符(qmark style)中参数 必须是序列类型 (sequence)。【博主注:序列类型 (sequence)常见有liststrtuple 和 bytes

命名占位符(named style)参数可以是序列类型(sequence),也可以是字典 dict 类型。

序列类型的长度必须和占位符的个数一致,否则会抛出 ProgrammingError 异常。

字典类型则必须包含所有的命名参数的键 key。

序列和字典里多余的项和元素会被忽略。

例子如下。

import sqlite3

con = sqlite3.connect(":memory:")
cur = con.cursor()
cur.execute("create table lang (name, first_appeared)")

# This is the qmark style:
cur.execute("insert into lang values (?, ?)", ("C", 1972))

# The qmark style used with executemany():
lang_list = [
    ("Fortran", 1957),
    ("Python", 1991),
    ("Go", 2009),
]
cur.executemany("insert into lang values (?, ?)", lang_list)

# And this is the named style:
cur.execute("select * from lang where first_appeared=:year", {"year": 1972})
print(cur.fetchall())

con.close()

深入研究会发现,问号占位符模式下,execute的第二个参数其实可以是 list,str, tuple, bytes,但是一般情况下是使用 不可被修改 tuple,更加安全。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qilei2010

送我一张彩票中了平分

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值