上一篇
Python如何查询数据库操作?
- 数据库
- 2025-06-10
- 4926
在Python中查询数据库通常使用DB-API兼容库(如sqlite3/pymysql)或ORM工具(如SQLAlchemy),基本流程:建立连接→创建游标→执行SQL语句→fetch获取结果→关闭连接,关键方法包括execute()和fetchall()/fetchone()。
Python数据库查询操作详解
在Python中执行数据库查询是开发Web应用、数据分析工具和自动化系统的核心技能,下面详细介绍从连接数据库到安全查询的完整流程,涵盖主流数据库操作。
准备工作:安装驱动与导入模块
Python通过专用驱动连接不同数据库,常用库如下:
数据库类型 | 安装命令 | 导入模块 |
---|---|---|
SQLite | 无需安装(内置) | import sqlite3 |
MySQL | pip install mysql-connector-python |
import mysql.connector |
PostgreSQL | pip install psycopg2 |
import psycopg2 |
连接数据库(以MySQL为例)
import mysql.connector # 创建数据库连接 db = mysql.connector.connect( host="localhost", user="your_username", password="your_password", database="your_database" ) # 创建游标对象 cursor = db.cursor()
执行SQL查询操作
基础查询(SELECT)
# 执行查询语句 cursor.execute("SELECT id, name, email FROM users WHERE age > %s", (18,)) # 获取全部结果 results = cursor.fetchall() for row in results: print(f"ID: {row[0]}, Name: {row[1]}, Email: {row[2]}")
参数化查询(防止SQL注入)
# 安全传参方式(使用占位符) user_id = 5 cursor.execute("SELECT * FROM orders WHERE user_id = %s", (user_id,))
分页查询
page = 2 limit = 10 offset = (page - 1) * limit cursor.execute("SELECT * FROM products LIMIT %s OFFSET %s", (limit, offset))
处理查询结果
方法 | 描述 | 使用场景 |
---|---|---|
fetchone() |
获取下一行记录 | 逐行处理大数据 |
fetchmany(size=5) |
获取指定数量记录 | 分批次读取 |
fetchall() |
获取所有记录(返回元组列表) | 小型数据集 |
dictcursor |
返回字典格式结果 | 需字段名访问时 |
字典游标示例:
cursor = db.cursor(dictionary=True) # MySQL cursor.execute("SELECT * FROM employees") for row in cursor: print(row["name"], row["salary"]) # 通过字段名访问
事务管理与异常处理
try: cursor.execute("UPDATE accounts SET balance = balance - 100 WHERE id=1") cursor.execute("UPDATE accounts SET balance = balance + 100 WHERE id=2") db.commit() # 提交事务 except Exception as e: db.rollback() # 回滚事务 print(f"操作失败: {e}") finally: cursor.close() db.close() # 必须关闭连接!
高级实践建议
-
使用上下文管理器(自动关闭连接)
with sqlite3.connect("mydb.db") as conn: cursor = conn.cursor() cursor.execute("SELECT * FROM logs") # 自动提交事务并关闭连接
-
ORM工具(如SQLAlchemy)
from sqlalchemy import create_engine, text engine = create_engine("sqlite:///mydb.db") with engine.connect() as conn: result = conn.execute(text("SELECT * FROM users")) for row in result: print(row)
-
异步查询(aiomysql/asyncpg)
import asyncio import aiomysql async def fetch_data(): conn = await aiomysql.connect(host='localhost', user='root', db='test') cursor = await conn.cursor() await cursor.execute("SELECT * FROM posts") print(await cursor.fetchall()) conn.close() asyncio.run(fetch_data())
安全注意事项
-
禁止字符串拼接SQL
# 危险示例(易受SQL注入攻击) query = f"SELECT * FROM users WHERE name='{user_input}'" # 正确做法 cursor.execute("SELECT * FROM users WHERE name=%s", (user_input,))
-
最小权限原则
数据库账号仅授予必要权限(如只读权限)。
性能优化技巧
- 使用
EXPLAIN
分析SQL执行计划 - 建立索引加速高频查询字段
- 批量操作时用
executemany()
data = [('Alice', 28), ('Bob', 32)] cursor.executemany("INSERT INTO users (name, age) VALUES (%s, %s)", data)
Python通过标准DB-API接口提供统一的数据库操作方式,核心步骤包括:
- 安装驱动 → 建立连接 → 创建游标
- 使用参数化SQL执行查询
- 通过
fetch*()
方法处理结果 - 事务提交/回滚 → 关闭连接
掌握这些技能可安全高效地操作SQLite、MySQL、PostgreSQL等主流数据库,实际开发中推荐使用ORM框架或异步驱动提升效率。
引用说明参考Python官方DB-API规范、MySQL Connector/Python文档、SQLite3模块文档及OWASP SQL注入防护指南,技术要点已通过Python 3.10+环境验证。