如何在PyMySQL中实现带可选WHERE条件的SELECT查询?
用PyMySQL实现带可选WHERE参数的SELECT查询方法
嘿,我帮你优化了这个带可选参数的查询方法,既解决了代码冗余问题,还能避开SQL注入的坑——你原来的思路方向是对的,但用字符串格式化拼接参数值是有风险的,下面是更安全可靠的完整实现:
import pymysql from typing import Optional, Tuple, List def connect_to_db(): # 替换成你的数据库连接配置 return pymysql.connect( host='your_host', user='your_db_user', password='your_db_password', database='your_target_db' ) def select_from_db(arg1: Optional[str] = None, arg2: Optional[int] = None) -> List[Tuple]: db_connection = None cursor = None try: db_connection = connect_to_db() cursor = db_connection.cursor() # 基础查询语句 base_sql = "SELECT * FROM your_table_name" where_clauses = [] query_params = [] # 动态构建WHERE条件和参数列表 if arg1 is not None: where_clauses.append("arg1 = %s") query_params.append(arg1) if arg2 is not None: where_clauses.append("arg2 = %s") query_params.append(arg2) # 拼接完整SQL(只有当有条件时才加WHERE子句) if where_clauses: base_sql += " WHERE " + " AND ".join(where_clauses) # 执行参数化查询 cursor.execute(base_sql, query_params) query_results = cursor.fetchall() return query_results finally: # 确保游标和连接必被关闭,防止资源泄漏 if cursor: cursor.close() if db_connection: db_connection.close()
关键细节说明:
- 安全的参数化查询:用
%s作为占位符,把实际参数值放在execute的第二个参数列表里,PyMySQL会自动处理参数转义,彻底避免SQL注入攻击(这比你原来用format拼接值安全太多)。 - 无冗余的条件拼接:用列表收集有效的查询条件,最后用
AND连接,完美解决了单个参数时开头多出and的语法错误问题。 - 资源安全保障:用
finally块确保不管查询成功还是报错,游标和数据库连接都会被关闭,不会出现连接泄漏的问题。 - 类型提示优化:用
Optional标记可选参数,让代码可读性更强,也能让IDE给你更准确的语法提示。
几种使用场景示例:
- 查询表中所有记录:
select_from_db() - 只按arg1过滤:
select_from_db(arg1="example_value") - 同时用arg1和arg2过滤:
select_from_db(arg1="test", arg2=456)
内容的提问来源于stack exchange,提问作者Stian
相关产品推荐
相关产品推荐

