凡在pymysql子句返回最后一行

问题描述 投票:1回答:2

考虑6行的表用户

   +_______________________+
   |     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,亚伯拉罕]。我怎样才能获取所有行?

python sql pymysql
2个回答
2
投票

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

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

pymysql.cursors.Cursor实例的executemany(个体,查询,args)方法

对一个查询运行多个数据

:PARAM查询:查询服务器上执行

:PARAM ARGS:序列或映射的序列。它是用来作为参数。

:回归:受影响,如果行的任何数。

这种方法提高了多行INSERT和REPLACE性能。否则,就相当于遍历ARGS与执行()。

所以,你想要的这里是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)

需要注意的是游标iterables,所以你并不需要明确地调用cursor.fetchall()然后循环的结果,您可以将光标直接迭代。还要注意的是,如果你想(id, name)元组的列表,使用DictCursor只是CPU周期的双重浪费(一次为建设类型的字典,一次用于重建的元组了出来),你可以只使用一个默认的光标并返回list(cursor)代替。


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)
© www.soinside.com 2019 - 2024. All rights reserved.