2012-10-12 21 views
19

fetchall演算の結果を、タプルまたは辞書のタプルではなくリストで取得したいとします。例えば、Python MySQLDB:リスト内の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]です。私がresulsetを解析するのを救うことができれば最高です。事前に感謝します

+0

を持っているDjangoは、おそらくこれを行うには、カスタムカーソルのクラスを提供する必要があります。 django dbバックエンドはこれを行うので、そこにインスピレーションを求めることができます。たとえば、 'django.db.backends.mysql.base.CursorWrapper'はMySQLカーソルの上で使用されますが、どこに登録されているのかわかりません。カスタムCursorを返すカスタムdbバックエンドを提供することを意味する場合があります。アクセスするときに必要なデータを解析する方が簡単です。 – dokkaebi

答えて

38

そしてリストの理解はどうですか?結果は((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] 
+4

私はそれを言いました、私はこれを避けようとしています。私は、結果をリストに直接取り込むことができるようにカーソルをプログラムできることを望んでいました。 –

+1

このシナリオが単なる例である場合、複数のフィールドを持つクエリでどのようにそれを計画していますか?だからこそ、最初にタプルのタプルを得るのです。 –

+0

誰がその例を挙げましたか?私はちょうどIDの単一の列を取得したいと行数は何百万です。私は、この高価な操作を避ける方法を見つけようとしている理由で、データの後処理を行いたいと思っています。 –

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 
-4
cursor.execute("""Select * From bs WHERE (id = %s)""",(id)) 

cursor.fetchall() 
13

この後、この問題を解決したことがあるかもしれませんが、 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"] 
7

デシベルクエリを平坦にするために検索しながらこの古いQはGoogleでアップしていますので、ここでより多くの提案があります。 ..

速いと考えると、list-flattening iteratorです。

他の回答はfetchall()を使用して最初にメモリ内のすべての行をロードし、次にそれを繰り返して新しいリストを作成します。非効率である可能性があります。 server side cursorいわゆるの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() 

しかし、問題もタグ付けされている素敵なsingle field query flattener

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

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

数年遅れましたが、これはOPが求めていたものです - データポイントの数のためにfetch all()を使用せずにリストを作成してください。 –

関連する問題