Python MySQLDB: получить результат fetchall в списке
Я хотел бы получить результат операции 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]. Будьте лучше, если я смогу сэкономить на разборе результатов. Спасибо заранее
Ответы
Ответ 1
А как насчет списков? Если результат ((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]
Ответ 2
Я уверен, что после всего этого времени вы решили эту проблему, однако, для некоторых людей, которые могут не знать, как получить значения курсора в качестве словаря с использованием MySQLdb, вы можете использовать этот метод, найденный здесь:
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"]
Ответ 3
Этот старый Q появляется в Google при поиске сглаживания запросов db, поэтому здесь есть больше предложений...
Рассмотрим быстрый список-сглаживающий итератор.
В других ответах используется fetchall()
, который сначала загружает все строки в памяти, а затем повторяет это, чтобы создать новый список. Может быть неэффективным. Может сочетаться с MySQL так называемым серверным курсором:
# 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, который имеет приятный однополюсный флаттер
class Bs(models.Model):
id_field = models.IntegerField()
list_of_ids = Bs.objects.values_list('id_field', flat=True)
Ответ 4
Если есть только одно поле, я могу использовать его для создания списка из базы данных:
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
Ответ 5
cursor.execute("""Select * From bs WHERE (id = %s)""",(id))
cursor.fetchall()