在Python开发中,通过执行SQL语言完成数据库查询是处理持久化数据的常用操作,整个过程需要依赖对应的数据库驱动建立连接,再发送SQL语句获取结果。

准备工作:选择数据库驱动
不同的数据库需要对应不同的Python驱动,常见的有MySQL对应pymysql、PostgreSQL对应psycopg2、SQLite对应内置的sqlite3模块。本文以MySQL数据库和pymysql驱动为例,先通过pip安装驱动:
pip install pymysql
建立数据库连接
连接数据库需要指定主机地址、端口、用户名、密码、数据库名等参数,建立连接后会得到一个连接对象,后续所有操作都基于这个对象。
import pymysql
# 建立数据库连接
conn = pymysql.connect(
host='127.0.0.1', # 数据库主机地址
port=3306, # 端口号
user='root', # 用户名
password='123456', # 密码
database='test_db', # 要操作的数据库名
charset='utf8mb4' # 字符集
)执行SQL查询语句
执行查询需要先创建游标对象,游标负责发送SQL语句并接收返回结果,查询完成后需要提交事务(查询操作可省略,但写入操作必须提交),最后关闭连接释放资源。
基础查询示例
# 创建游标对象
cursor = conn.cursor()
# 定义要执行的SQL查询语句
sql = "SELECT id, name, age FROM user WHERE age > 18"
# 执行SQL语句
cursor.execute(sql)
# 获取所有查询结果,返回的是元组组成的列表
result = cursor.fetchall()
# 遍历打印结果
for row in result:
print(f"用户ID:{row[0]}, 姓名:{row[1]}, 年龄:{row[2]}")
# 关闭游标和连接
cursor.close()
conn.close()参数化查询(防SQL注入)
直接拼接SQL字符串容易引发SQL注入风险,建议使用参数化查询,将参数通过元组传入execute方法,驱动会自动处理参数转义。
cursor = conn.cursor() # 参数用%s占位,参数值放在元组中传入 sql = "SELECT id, name, age FROM user WHERE age > %s AND city = %s" params = (18, "北京") cursor.execute(sql, params) # 获取单条结果 one_result = cursor.fetchone() print(one_result) cursor.close() conn.close()
不同查询方法的区别
游标对象提供了三种获取结果的方法,适用场景不同,具体区别如下:
| 方法名 | 作用 | 适用场景 |
|---|---|---|
| fetchall() | 获取所有查询结果 | 结果集较小,需要一次性处理全部数据 |
| fetchone() | 获取单条查询结果,游标自动后移 | 结果集较大,逐条处理数据 |
| fetchmany(size) | 获取指定条数的结果 | 需要分页处理数据,每次获取固定条数 |
注意事项
- 操作完成后务必关闭游标和连接,避免资源泄露,也可以使用上下文管理器自动管理资源。
- 写入、修改、删除操作执行后需要调用
conn.commit()提交事务,否则操作不会生效。 - 如果查询的表字段较多,可以使用
cursor = conn.cursor(pymysql.cursors.DictCursor)创建字典类型的游标,返回结果是字典形式,方便通过字段名取值。
# 使用上下文管理器自动关闭资源
import pymysql
with pymysql.connect(
host='127.0.0.1',
port=3306,
user='root',
password='123456',
database='test_db',
charset='utf8mb4',
cursorclass=pymysql.cursors.DictCursor # 字典游标
) as conn:
with conn.cursor() as cursor:
cursor.execute("SELECT id, name FROM user LIMIT 5")
result = cursor.fetchall()
for row in result:
print(f"ID:{row['id']}, 姓名:{row['name']}")