【问题标题】:Passing a list in a WHERE clause python mysql [duplicate]在WHERE子句python mysql中传递列表[重复]
【发布时间】:2019-05-12 18:37:07
【问题描述】:

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

party_ids= [4, 3, 1, 2]

def initializegame(party_ids):
    #Get selected party members IDS
    print(party_ids)
    #Obtain Speeds
    fetchspeed=("SELECT startspeed FROM characters WHERE CharID=%s")
    print(fetchspeed)
    mycursor.execute(fetchspeed,party_ids)
    myspeeds=mycursor.fetchall()
    print(myspeeds)
    print("done")

我对 SQL 比较陌生,可能会漏掉一些重要的东西。

我确实尝试过: passing a list to a where clause 然而,这有点难以理解。

提前致谢

【问题讨论】:

    标签: python mysql


    【解决方案1】:

    当您有多个要过滤的值时,请使用 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变成:

    SELECT startspeed FROM characters WHERE CharID IN (%s,%s,%s,%s)

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

    【讨论】:

      【解决方案2】:

      您可以使用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 关键字及其工作原理的更多信息。

      【讨论】:

      • 此代码容易受到 SQL 攻击不要使用字符串格式来插入值。 party_ids = ["''; DROP TABLE characters"] 将在此函数运行时从数据库中删除 characters 表。
      猜你喜欢
      • 1970-01-01
      • 2018-11-17
      • 2021-04-20
      • 1970-01-01
      • 2018-06-22
      • 1970-01-01
      • 2019-12-22
      • 2017-05-10
      • 1970-01-01
      相关资源
      最近更新 更多