pymysql中的WHERE IN子句返回最后一行

时间:2019-02-05 14:12:18

标签: python sql pymysql

考虑一个包含6行的表 users

   +_______________________+
   |     userid |  name    |
   +-----------------------+
   |       1    | john     |
   |       2    | steve    |
   |       3    | joe      |
   |       4    | jason    |
   |       5    | abraham  |
   |       6    | leonard  |
   +-----------------------+

我正在使用以下SQL查询:

SELECT userid,name FROM users where userid IN (2,3,4,5);

返回4行-

   |       2    | steve    |
   |       3    | joe      |
   |       4    | jason    |
   |       5    | abraham  |

pymysql的等效代码如下:

def get_username(user_ids):
    data=[]
    conn = init_db()
    cur = conn.cursor(pymysql.cursors.DictCursor)
    cur.executemany("SELECT userid,name from users WHERE userid IN (%s)",user_ids)
    rows=cur.fetchall()
    for row in rows:
        data.append([row['userid'],row['name']])
    cur.close()
    conn.close()
    return data

user_ids=[2,3,4,5]
get_usernames(user_ids)

此代码仅返回最后一行[[5,abraham]]。我该如何获取所有这些行?。

2 个答案:

答案 0 :(得分:2)

这是.executemany()的(部分记录)行为:

  

有关pymysql.cursors模块中方法executemany的帮助:

     pymysql.cursors.Cursor实例的

executemany(self,query,args)方法

     

针对一个查询运行多个数据

     

:参数查询:要在服务器上执行的查询

     

:param args:序列或映射的序列。用作参数。

     

:返回:受影响的行数(如果有)。

     

此方法提高了多行INSERT和      更换。否则,等效于使用      execute()。

因此,您想要的是cursor.execute()-但是,您需要做更多的工作来构建SQL查询:

user_ids = (2, 3, 4, 5)
placeholders = ", ".join(["%s"] * len(user_ids)) 
sql = "SELECT userid,name from users WHERE userid IN ({})".format(placeholders)
cursor.execute(sql, user_ids)
data = list(cursor)

请注意,游标是可迭代的,因此您无需显式调用cursor.fetchall()然后对结果进行迭代,可以直接在游标上进行迭代。还要注意,如果您想要一个(id, name)元组的列表,则使用DictCursor只会浪费CPU周期的两倍(一次用于构建dict,一次用于从中重建tuple),使用默认光标并返回list(cursor)

答案 1 :(得分:0)

我的第一个猜测是与SELECT语句相关的东西。 您可以尝试使用这种方式生成查询吗?

def get_username(user_ids):
    data=[]
    conn = init_db()
    cur = conn.cursor(pymysql.cursors.DictCursor)
    cur.executemany("SELECT userid,name from users WHERE userid IN "+"("+','.join(str(e) for e in user_ids)+")")
    rows=cur.fetchall()
    for row in rows:
        data.append([row['userid'],row['name']])
    cur.close()
    conn.close()
    return data

user_ids=[2,3,4,5]
get_usernames(user_ids)