考虑一个包含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]]。我该如何获取所有这些行?。
答案 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)