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) или [ 123234]. Будет лучше, если я смогу сэкономить на разборе результата. заранее спасибо

 dokkaebi12 окт. 2012 г., 23:23
Вероятно, для этого нужно предоставить собственный класс Cursor. Бэкэнды django db делают это, чтобы вы могли искать вдохновение там. Например,django.db.backends.mysql.base.CursorWrapper используется поверх курсора MySQL, но я не уверен, где он зарегистрирован. Это может означать предоставление настраиваемой базы данных базы данных, которая возвращает ваш собственный курсор. Скорее всего, будет проще проанализировать данные, которые вам нужны при доступе к нему.

Ответы на вопрос(6)

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

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

Затем, когда вы выполняете cursor.fetchall () для запроса, будет получен набор словарей, который вы позже сможете преобразовать в список.

data = cursor.fetchall()

data = list(data)

А как насчет списков? Если результат((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]
 César13 окт. 2012 г., 00:57
@RaunakAgarwal, возможно, вы можете использовать генераторы вместо списочных представлений. Я думаю, это не будет так дорого, потому что генераторы ленивые оценки
 scytale13 окт. 2012 г., 00:18
@RaunakAgarwal - пожалуйста, будьте вежливы - вы не упомянули об ограничениях, над которыми работали, в своем вопросе, поэтому вполне разумно, чтобы кто-то предложил развернуть вложенность на стороне клиента. Вы должны были упомянуть, что имели дело с миллионами строк.
 Raunak Agarwal13 окт. 2012 г., 00:11
Кто сказал, что это пример? Я просто хочу получить один столбец идентификаторов и количество строк в миллионах. Я хочу сделать пост-обработку данных, поэтому я пытаюсь найти способ избежать этой дорогостоящей операции.
 Raunak Agarwal12 окт. 2012 г., 23:52
Чувак, я упомянул это, я пытаюсь избежать этого. Я надеялся, что курсор можно запрограммировать так, чтобы результат можно было получить непосредственно в списке.
 César13 окт. 2012 г., 00:03
Так что, если этот сценарий является лишь примером, как вы планируете это с запросами, которые имеют более одного поля? Вот почему вы получаете кортеж в первую очередь

я могу использовать это для создания списка из базы данных:

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

в к базе данных, так что вот еще несколько советов ...

Считай быстрыйитератор выравнивания списка.

Другие ответы используют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)
 Carolina Cárdenas19 мая 2018 г., 10:57
Решение протестировано с sqlite3. Работает отлично!
 Kevin Bott14 сент. 2017 г., 20:53
Несколько лет спустя, но это то, о чем спрашивал OP - создать список без использования fetch all () из-за количества его точек данных.

что после всего этого времени вы решили эту проблему, однако, для некоторых людей, которые могут не знать, как получить значения курсора в качестве словаря, используя 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"]
cursor.execute("""Select * From bs WHERE (id = %s)""",(id))

cursor.fetchall()

Ваш ответ на вопрос