web-dev-qa-db-ja.com

Python MySQLDB:fetchallの結果をリストで取得する

Tuple of TupleやTuple of辞書の代わりに、リストで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]。結果を解析することで節約できれば最高です。前もって感謝します

28
Raunak Agarwal

リスト内包表記についてはどうでしょうか?結果が((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]
52
César

結局、この問題は解決したと思いますが、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"]
15
onetwopunch

この古いQは、フラット化dbクエリの検索中にGoogleに表示されるため、ここにさらに提案があります...

高速な list-flattening iterator を検討してください。

他の回答では、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というタグも付けられています。これには、Nice single field query flattener があります。

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

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

フィールドが1つしかない場合、これを使用してデータベースからリストを作成できます。

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
1
pupil

この方法でカーソルオブジェクトを作成します。

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

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

その後、クエリでcursor.fetchall()を実行すると、辞書のタプルが取得され、後でリストに変換できます。

data = cursor.fetchall()

data = list(data)
1
Sahana Joshi