PyMySQL-Python:如何通过SQL查询关联两个输入参数?
嘿,我来帮你搞定这个问题!首先得提醒你一下,你原来用format直接拼接SQL的写法有严重的SQL注入风险——要是有人恶意输入类似'; DROP TABLE movies; --的内容,你的数据表可能直接就没了,所以强烈建议用参数化查询来替代字符串格式化。
接下来针对你的需求,我们要查询两个演员(input1和input2)共同出演的所有电影记录,这里要考虑两种场景:一是两个演员分别作为Actor1和Actor2出现(顺序相反的情况也要包含),二是如果输入的是同一个演员,也要包含他自己和自己出演的记录。
正确的参数化查询写法
下面是两种可靠的写法,都能覆盖所有场景:
写法1:明确覆盖正反顺序+同名场景
这种写法逻辑清晰,一眼就能看懂:
# 定义参数化SQL语句,用%s作为占位符(不同数据库可能用?或其他,比如SQLite用?,MySQL用%s) sql_query = """ SELECT Actor1, Actor2, Movies FROM movies WHERE (Actor1 = %s AND Actor2 = %s) OR (Actor1 = %s AND Actor2 = %s) """ # 把输入参数按顺序传给execute方法 cursor.execute(sql_query, (input1, input2, input2, input1))
当input1和input2是同一个演员时,比如input1=input2='nick',这个查询会自动匹配nick nick c这条记录,因为两个条件里的第一个(Actor1='nick' AND Actor2='nick')会命中。
写法2:更简洁的通用写法
如果想让SQL更紧凑,可以用IN来简化条件:
sql_query = """ SELECT Actor1, Actor2, Movies FROM movies WHERE (Actor1 IN (%s, %s) AND Actor2 IN (%s, %s)) AND (Actor1 != Actor2 OR %s = %s) """ cursor.execute(sql_query, (input1, input2, input1, input2, input1, input2))
这个写法的逻辑是:先筛选出Actor1和Actor2都是目标演员的记录,再额外允许当两个输入相同时,保留演员自己和自己出演的记录(避免Actor1 != Actor2把同名记录过滤掉)。
举个实际例子
比如你输入input1='stef',input2='bill',查询会返回两条记录:
stef bill a
bill stef b
如果输入input1='nick',input2='nick',会返回:
nick nick c
为什么不用你原来的format写法?
再强调一遍:直接用format拼接SQL是不安全的。比如如果有人输入input1="'; DROP TABLE movies; --",你的SQL会变成:
select Actor1,Actor2 from movies where Actor1= '; DROP TABLE movies; --'
这会直接删除你的movies表,后果不堪设想。参数化查询会自动处理输入的转义,彻底避免这个问题。
内容的提问来源于stack exchange,提问作者stef

