在查询PyMySQL中使用WHERE

时间:2019-04-11 22:34:28

标签: python mysql pymysql

我正在尝试创建一个程序,用户可以在其中输入运算符,即<>或=,然后输入pymysql中的数据库编号。我尝试了多种不同的方法来完成此操作,但不幸的是未成功。我有两个显示为一个的文档,并将显示导入到另一个文档中。

文档1

def get_pop(op, pop):
if (not conn):
    connect();

query = "SELECT * FROM city WHERE Population %s %s"


with conn:
    cursor = conn.cursor()
    cursor.execute(query, (op, pop))
    x = cursor.fetchall()
    return x

文档二

 def city():
     op = input("Enter < > or =: ")
     population = input("Enter population: ")
     pop = display.get_pop(op, population)
     for p in pop:  
     print(pop) 

我遇到以下错误。

pymysql.err.ProgrammingError:(1064,......

请帮助谢谢

2 个答案:

答案 0 :(得分:1)

在检查op确实包含“ <>”或“ =”并且pop确实包含数字之后,您可以尝试以下方法:

query = "SELECT * FROM city WHERE Population " + op + " %s";

提防SQL注入。

然后

cursor.execute(query, (pop))

答案 1 :(得分:1)

您不能这样做。参数化仅适用于值,不适用于运算符或表名或列名。您需要将运算符格式化为字符串。不要将%s占位符与Python字符串格式混淆; MySQL很尴尬,因为它使用%s来绑定参数,这与常规的Python字符串格式冲突。

查询字符串中的MySQL %s会转义用户输入,以防止SQL注入。在这种情况下,我设置了一个基本测试,以查看用户提交的操作部分是否在可接受的操作列表中。

def get_pop(op, pop):
    query = "SELECT * FROM city WHERE Population {} %s" # Add a placeholder for format

    with conn: # Where does this come from?
        cursor = conn.cursor()
        if op in ['=', '!=']:
            cursor.execute(query.format(op), (pop,))
            x = cursor.fetchall()
            return x

return不是if op in ['=', '!=']的情况下,您将想出一些合理的True值,但这完全取决于您希望它如何表现。