2016-09-05 3 views
2

マイSQL(sqlite3の)クエリは、この線に沿っている:SQLクエリから返されたk:vタプルのリストから辞書を作成するにはどうすればよいですか?

SELECT id, name FROM mytable; 

これは、行のトンを返します。私はこれらの結果から、IDを与えられた名前を検索できる辞書を作成したいと思います。

他の回答私はSQL結果に基づいて辞書を作成するようだが、彼らはキーとして列のラベルを使用する - 私はそれに興味がないです。

例表:

id | name 
------+-------- 
foo | bar 
baz | foobar 

所望の辞書:あなたが行(result cursor is iterable)、unpackキーと値をループし、使用して結果を組み立てることができる

{ 
    'foo': 'bar', 
    'baz': 'foobar' 
} 
+1

[MCVE]してください与えます。 – Julien

+0

@JulienBernuしました。 – theanine

+0

['' 'dictionary comprehension'''](https://docs.python.org/3/reference/expressions.html?highlight=displays#displays-for-lists-sets-and-dictionaries) – wwii

答えて

2

カーソルから返される結果は、2要素のタプルのリストです:

result = dict(cursor.execute("SELECT id, name FROM mytable")) 
+0

私はこれを試しましたが、うまくいきませんでした。ValueError:辞書更新シーケンス要素#0の長さが1です。 2が必要です – theanine

+0

いいえ、私が列挙したクエリは同じクエリ(別のテーブル名を使用していますが、それだけです)です。 – theanine

+0

クエリ結果はどのように見えますか? – ozgur

3

dict comprehension

desired_dict = {k:v for k, v in c.execute('SELECT id, name FROM MyTable')} 

私はdict comprehenを使用しています辞書に追加する前に結果に追加の処理を加えることができます(例:大文字の変更、10進数または日時への変換など)。ここで

desired_dict = dict(c.execute('SELECT id, name FROM MyTable')) 

はに処理開始を実証する実際のサンプルセッションです:あなたは辞書に直接移動したい場合は、ozgurが直接dict()を呼び出すことで短く、より高速な方法を持っている、と述べた

フィニッシュ:各タプルの最初の項目が一意の値であるとして、あなただけの辞書にそれを変換することができるように

>>> import sqlite3 
>>> c = sqlite3.connect('tmp.db') 
>>> c.execute('CREATE TABLE MyTable (id text, name text)') 
<sqlite3.Cursor object at 0x106227f80> 
>>> c.execute("INSERT INTO MyTable VALUES ('abc', 'Alpha')") 
<sqlite3.Cursor object at 0x106283810> 
>>> c.execute("INSERT INTO MyTable VALUES ('def', 'Beta')") 
<sqlite3.Cursor object at 0x106227f80> 
>>> c.execute("INSERT INTO MyTable VALUES ('ghi', 'Gamma')") 
<sqlite3.Cursor object at 0x106283810> 
>>> c.commit() 
>>> c.close() 
>>> 
>>> c = sqlite3.connect('tmp.db') 
>>> {k:v for k, v in c.execute('SELECT id, name FROM MyTable')} 
{'ghi': 'Gamma', 'def': 'Beta', 'abc': 'Alpha'} 
+0

を使用するValueError:アンパックするために1つ以上の値が必要です。 – theanine

+0

@ComtriSすべてのステップの終了を示すために実際のセッションを追加しました。それがどのようにしてキンクを起こすのに役立ちますか:-) –

0

db_conn = sqlite3.connect('text.db') cur = db_conn.cursor() cur.execute('''select id, name from mytable''')

のようなもの、あなたはcur.fetchall()の見返りに、すべてのクエリ結果を得ることができ、あなたはPythonでSQLクエリの結果を取得したとします。 結果はタプルのリストになります。各タプルは(id,という名前は)のようになります。これを知っ

は、それが辞書にそれを変換するためのケーキの一部である、ちょうど:

mydict = {} for item in cur.fetchall(): mydict[item[0]] = item[1]

関連する問題