- cursor.execute
python
cursor.execute(sql, parameters)
- sql:字符串类型,要执行的 SQL 语句(如查询、插入、更新等)。
- parameters(可选):元组或字典,用于传递 SQL 语句中的参数(避免 SQL 注入,推荐使用)。
- 执行无参数的 SQL 语句
python和sql
# 示例:查询所有图书
cursor.execute("SELECT * FROM books")
# 获取结果
all_books = cursor.fetchall() # 所有结果
- 执行带参数的 SQL 语句(推荐) 使用参数化查询 (? 占位符)传递动态值,避免直接拼接字符串(防止 SQL 注入和语法错误)。
- 方式 1:使用 ? 作为占位符(SQLite 推荐)
- 参数以元组形式传递,顺序与 ? 一一对应。
sql
# 示例:查询作者为"鲁迅"**的图书**
author = "鲁迅"
# SQL 中用?代替具体值
cursor.execute("SELECT * FROM books WHERE author = ?", (author,)) # 注意元组的逗号
# 获取结果
books = cursor.fetchall()
- 方式 2:使用命名占位符(如 :name)
- 参数以字典形式传递,可读性更好(适合参数较多的场景)。
js
# 示例:插入新图书
book_data = {
"title": "Python编程",
"author": "张三"
}
cursor.execute('''
INSERT INTO books (title, author)
VALUES (:title, :author)
''', book_data) # 字典的key与占位符:title、:author对应
conn.commit() # 提交事务(写操作必需)
- 方式3. 执行批量操作(executemany)
- 对多条数据执行相同的 SQL 语句(如批量插入),效率高于多次调用 execute。
js
# 示例:批量插入3本图书
books = [
("book1", "author1"),
("book2", "author2"),
("book3", "author3")
]
cursor.executemany(
"INSERT INTO books (title, author) VALUES (?, ?)",
books # 列表中的每个元组对应一条数据
)
conn.commit()
关键注意事项
-
写操作需要提交事务: 执行 INSERT/UPDATE/DELETE 等修改数据的操作后,必须调用 conn.commit() 才能将修改保存到数据库。若出错,可调用 conn.rollback() 回滚。
-
参数传递格式:
- 单参数时,元组需加逗号 :(value,)(避免被解析为普通括号)。
- 字符串参数无需手动加单引号,参数化查询会自动处理。
- SQL 注入风险: 严禁直接拼接字符串生成 SQL(如 f"SELECT * FROM books WHERE author = '{author}'"),恶意输入(如 author = "'); DROP TABLE books;--)会导致数据泄露或破坏。
- 结果获取方法:
- cursor.fetchone():获取一条结果(查询时用)。
- cursor.fetchall():获取所有结果(查询时用)。
- cursor.rowcount:获取受影响的行数(如 UPDATE/DELETE 后)。
完整试例:
Python和Sql
import sqlite3
# 连接数据库
conn = sqlite3.connect("test.db")
cursor = conn.cursor()
# 创建表
cursor.execute('''
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY,
name TEXT,
age INTEGER
)
''')
# 插入数据(带参数)
cursor.execute("INSERT INTO users (name, age) VALUES (?, ?)", ("Alice", 25))
conn.commit() # 提交
# 查询数据
cursor.execute("SELECT * FROM users WHERE age > ?", (18,))
print(cursor.fetchall()) # 输出: [(1, 'Alice', 25)]
# 关闭连接
cursor.close()
conn.close()