Python用法记录

  1. cursor.execute
python 复制代码
cursor.execute(sql, parameters)
  • sql:字符串类型,要执行的 SQL 语句(如查询、插入、更新等)。
  • parameters(可选):元组或字典,用于传递 SQL 语句中的参数(避免 SQL 注入,推荐使用)。
  1. 执行无参数的 SQL 语句
python和sql 复制代码
# 示例:查询所有图书
cursor.execute("SELECT * FROM books")
# 获取结果
all_books = cursor.fetchall()  # 所有结果
  1. 执行带参数的 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()

关键注意事项

  1. 写操作需要提交事务: 执行 INSERT/UPDATE/DELETE 等修改数据的操作后,必须调用 conn.commit() 才能将修改保存到数据库。若出错,可调用 conn.rollback() 回滚。

  2. 参数传递格式:

  • 单参数时,元组需加逗号 :(value,)(避免被解析为普通括号)。
  • 字符串参数无需手动加单引号,参数化查询会自动处理。
  • SQL 注入风险: 严禁直接拼接字符串生成 SQL(如 f"SELECT * FROM books WHERE author = '{author}'"),恶意输入(如 author = "'); DROP TABLE books;--)会导致数据泄露或破坏。
  1. 结果获取方法:
  • 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()

相关推荐
A7bert7776 分钟前
【YOLOv5部署至RK3588】模型训练→转换RKNN→开发板部署
c++·人工智能·python·深度学习·yolo·目标检测·机器学习
冷月半明22 分钟前
时间序列篇:Prophet负责优雅,LightGBM负责杀疯
python·算法
教练我想打篮球_基本功重塑版1 小时前
L angChain 加载大模型
python·langchain
跟橙姐学代码3 小时前
手把手教你玩转 multiprocessing,让程序跑得飞起
前端·python·ipython
LCS-3123 小时前
Python爬虫实战: 爬虫常用到的技术及方案详解
开发语言·爬虫·python
穷儒公羊3 小时前
第二章 设计模式故事会之策略模式:魔王城里的勇者传说
python·程序人生·设计模式·面试·跳槽·策略模式·设计规范
心本无晴.3 小时前
面向过程与面向对象
python
站大爷IP3 小时前
用PyQt快速搭建桌面应用:从零到实战的实用指南
python
站大爷IP4 小时前
PyCharm:Python开发者的智慧工作台全解析
python