考虑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,亚伯拉罕]。我怎样才能获取所有行?
这是.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)
代替。
我的第一个猜测是,是什么相关的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)