2012-01-05 22 views
0

基於值的數據我有朋友的詞典列表結構如下的Python/MySQL的得到表在字典中

friendships = [{'name1': 'Joe Bloggs', 'name2': 'Jane Bloggs'}, 
{'name1': 'Joe Bloggs', 'name2': 'Jan Doe'}, 
{'name1': 'Another Name', 'name2': 'Someone Else'}] 

我有叫People與每個人一個MySQL表。該表的結構是

id, name 

例如,

1 Joe Bloggs 
2 Jane Bloggs 
3 Jan Doe 
4 Another Name 
5 Someone Else 

我想寫一個SQL查詢,這將讓我從表中的朋友的ID類似的結構,我在一開始有例如

friendship_ids = [{'id1': '1', 'id2': '2'}, 
{'id1': '1', 'id2': '3'}, 
{'id1': '4', 'id2': '5'}] 

我目前做到這一點通過每一行中friendships循環和獲取ID的方式,但該列表是相當大,因此想用1個查詢做到這一點。

friendship_ids = [] 
for f in friendships 
    cur.execute("SELECT (SELECT id FROM Person WHERE name = '%s') AS id1, (SELECT id FROM Person WHERE name = '%s') AS id2" % (f.name1, f.name2)) 
    d = cur.fetchone() 
    friendship_ids.append(d) 
+0

我不知道你的意思。你能澄清嗎?是這樣的:'從人'選擇id,將gett你所有的id:s。 – 2012-01-05 14:52:03

+2

爲什麼不在數據庫中創建名爲'Friendships'的第二個表,並將友情數據添加到它中,而不是將Python數據結構與關係存儲混合? – 2012-01-05 14:52:48

+1

這似乎更適合Django,即使你沒有將它用於Web應用程序。 – Edwin 2012-01-05 14:58:06

回答

0

我想,如果你真的不想要第二個表來存儲的友誼,你可以使用這樣的事情:

import itertools 

# collect all the names involved 
names = itertools.chain.from_iterables(f.values() for f in friendships) 
query = 'SELECT name, id FROM People WHERE name in (%s)' \ 
      % ','.join(mysql_escape(n) for n in names) 

替換mysql_escape與你的MySQL驅動程序的一些報價服務。然後執行queryand使用返回的行這樣的:

# will contain a map from names to IDs 
name_to_id = dict((row["name"], row["id"]) for row in rows) 

然後,您可以建立你friendship_ids這樣的:

friendship_ids = [{'id1': name_to_id[f['name1']], 'id2': name_to_id[f['name2']]} 
        for f in friendships] 
+0

謝謝這是我以後的答案。然而,事實證明,運行它超過1個查詢需要比循環和做單個查詢花費更多的時間 – John 2012-01-06 12:38:35