在WHERE子句中传递列表python mysql

时间:2019-05-12 18:37:08

标签: python mysql

我正在尝试从数据库中的表中获取速度值列表。我想知道它们是否是SQL命令/方法,该方法是否允许我在WHERE函数中传递CharID列表,这样就不必创建FOR循环并单独进行四个搜索。

background-image

我对SQL比较陌生,可能缺少一些重要知识。

我确实尝试过: passing a list to a where clause 但这太难了。

预先感谢

2 个答案:

答案 0 :(得分:0)

您可以使用IN关键字基于列表进行过滤。

party_ids= [4, 3, 1, 2]

def initializegame(party_ids):
    #Get selected party members IDS
    print(party_ids)
    #Obtain Speeds

    ids_string = ','.join(str(id) for id in party_ids)
    mycursor.execute("SELECT startspeed FROM characters WHERE CharID IN ({0})".format(ids_string))

    myspeeds=mycursor.fetchall()
    print(myspeeds)
    print("done")

您可以从此MySQL blog tutorial中找到有关IN关键字及其工作方式的更多信息。

答案 1 :(得分:0)

当您要过滤多个值时,请使用 IN 关键字。在这种情况下,您具有已知的整数值,因此SQL注入不是问题。但是,您的函数是在可以传递任意值的情况下编写的,在此情况下,SQL注入可能会成为问题,或者可能会传递需要转义的字符串文字。因此,需要通过让数据库驱动程序处理实际参数来解决这些问题:

party_ids= [4, 3, 1, 2]

def initializegame(party_ids):
    #Get selected party members IDS
    print(party_ids)
    #Obtain Speeds

    in_params = ','.join(['%s'] * len(party_ids))
    sql = "SELECT startspeed FROM characters WHERE CharID IN (%s)" % in_params
    mycursor.execute(sql, party_ids)

    myspeeds=mycursor.fetchall()
    print(myspeeds)
    print("done")

变量 sql 变为:

从字符“ CHARID IN”(%s,%s,%s,%s)中选择启动速度

然后 execute 语句将4个 IN 值的列表作为第二个参数传递。