irpas技术客

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

未知 471

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?的?execuite()?的第二个参数来实现。

有两种占位符方式。

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

问号占位符(qmark style)中参数?必须是序列类型 (sequence)。【博主注:序列类型 (sequence)常见有list,?str,?tuple, and?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,更加安全。


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。

标签: #Python #sqlite3 #参数