django Python MySQLDB:在列表中获取fetchall的结果

xqk2d5yq  于 2022-12-24  发布在  Go
关注(0)|答案(7)|浏览(205)

我希望在列表中获取fetchall操作的结果,而不是元组的元组或字典的元组。例如,

cursor = connection.cursor() #Cursor could be a normal cursor or dict cursor
query = "Select id from bs"
cursor.execute(query)
row = cursor.fetchall()

现在,问题是生成的行是((123,),(234,))或({'id':123},{'id':234}),而我要查找的是(123,234)或[123,234]。如果我可以保存解析结果集的时间,那就最好了。

9w11ddsr

9w11ddsr1#

那么列表解析呢?如果result是((123,), (234,), (345,))

>>> row = [item[0] for item in cursor.fetchall()]
>>> row
[123, 234, 345]

如果结果为({'id': 123}, {'id': 234}, {'id': 345})

>>> row = [item['id'] for item in cursor.fetchall()]
>>> row
[123, 234, 345]
sbdsn5lh

sbdsn5lh2#

我相信经过这么长时间,您已经解决了这个问题,但是,对于一些可能不知道如何使用MySQLdb将游标的值作为字典获取的人来说,您可以使用here中找到的方法:

import MySQLdb as mdb

con = mdb.connect('localhost', 'testuser', 'test623', 'testdb')

with con:

    cur = con.cursor(mdb.cursors.DictCursor)
    cur.execute("SELECT * FROM Writers LIMIT 4")

    rows = cur.fetchall()

    for row in rows:
        print row["Id"], row["Name"]
balp4ylt

balp4ylt3#

这个老问题出现在谷歌搜索扁平化数据库查询时,所以这里有更多的建议...
考虑一个快速的list-flattening iterator
其他答案使用fetchall(),它首先加载内存中的所有行,然后迭代生成一个新列表。可能效率很低。可以与MySQL所谓的server side cursor合并:

# assume mysql on localhost with db test and table bs
import itertools
import MySQLdb
import MySQLdb.cursors

conn = MySQLdb.connect(host='localhost',db='test', 
          cursorclass=MySQLdb.cursors.SSCursor ) 
cursor = conn.cursor()
# insert a bunch of rows
cursor.executemany('INSERT INTO bs (id) VALUES (%s)',zip(range(1,10000)) )
conn.commit()
# retrieve and listify
cursor.execute("select id from bs")
list_of_ids = list(itertools.chain.from_iterable(cursor))
len(list_of_ids)
#9999
conn.close()

但是这个问题也被标记为Django,它有一个很好的single field query flattener

class Bs(models.Model):
    id_field = models.IntegerField()

list_of_ids = Bs.objects.values_list('id_field', flat=True)
db2dz4w8

db2dz4w84#

按以下方式使光标成为对象:

db = MySQLdb.connect("IP", "user", "password", "dbname")

cursor = db.cursor(MySQLdb.cursors.DictCursor)

然后,当您对查询执行cursor.fetchall()时,将获得字典的元组,您可以稍后将其转换为列表。

data = cursor.fetchall()

data = list(data)
jaql4c8m

jaql4c8m5#

list= [list[0] for list in cursor.fetchall()]

这将在一个列表中呈现结果,如- list = [122,45,55,44...]

brc7rcf0

brc7rcf06#

如果只有一个字段,我可以用这个从数据库中制作一个列表:

def getFieldAsList():
    kursor.execute("Select id from bs")
    id_data = kursor.fetchall()
    id_list = []
    for index in range(len(id_data)):
        id_list.append(id_data[index][0])
    return id_list
h22fl7wq

h22fl7wq7#

cursor.execute("""Select * From bs WHERE (id = %s)""",(id))

cursor.fetchall()

相关问题