2012-08-04 33 views
10

想象一下,您有一個包含大量項目的鍵值Python字典(或列表)。假設您正在閱讀更大的JSON文件,並且您希望將其內容存儲到MySQL表中,並將鍵作爲列的名稱和值作爲值本身。將Python字典/列表插入到SQL數據庫中最有效的方法是什麼?

JSON實例:

"display_location": { 
    "city":"Bratislava", 
    "state_name":"Slovakia", 
    "country_iso3166":"SK", 
    "latitude":"48.20000076", 
    "longitude":"17.20000076", 
} 

然後,它是非常低效的寫SQL插入這樣的手動:

INSERT INTO TABLE (city, state_name, country_iso3166, latitude, longitude) VALUES('%s','%s','%s','%s','%s') 
% (Bratislava, Slovakia, SK, 48.20000076, 17.20000076); 

(好吧,它的確定有五個值,但想有用於例五數百個)。

有沒有用於有效和短弦SQL插入的Python類/方法?我寫這段代碼:

for key,value in list.iteritems(): 
    value_type = type(value) 
    if value_type is unicode: 
     vars_to_sql.append(value.encode('ascii', 'ignore')) 
     keys_to_sql.append(key.encode('ascii', 'ignore')) 
    else: 
     vars_to_sql.append(value) 
     keys_to_sql.append(key) 

keys_to_sql = ', '.join(keys_to_sql) 

此後插入看起來更簡單:

INSERT INTO conditions_bratislava(%s) VALUES %r" % (keys_to_sql, tuple(vars_to_sql),) 

可以有成千上萬的值,你仍然會被罰款與這一個INSERT語句。

請注意,將解碼Unicode字符串的條件,所以你不會有每個值之前的「u」字母。

那麼,有沒有更有效的和準備好的類或方法如何插入許多值與簡單的方法與短INSERT字符串?

+1

如果您確實想要使用關係數據庫,可以使用即將推出的具有本機JSON數據類型的PostgreSQL 9.2。 – 2012-08-04 12:01:44

回答

6

如果您的數據結構那樣,那就更借本身對文檔導向的數據庫(蒙戈/沙發等...)

你可以逃脫這樣的事情...我認爲使用repr正在一點點太聰明......

insert_sql = 'INSERT INTO conditions_bratislava(%s) values(%s)' 
cols = ', '.join(somedict) 
vals = ', '.join('?' * len(somedict)) # or whatever qparam is required 
to_execute = insert_sql % (cols, vals) 
some_cursor.execute(to_execute, somedict.values()) 

在一個側面說明:

value_type = type(value) 
if value_type is unicode: 

應該寫成:

if isinstance(value, unicode): 
+0

'isinstance'上的+1 – 2012-08-04 12:46:38

+0

如果字典在第二個線程中被修改,則這可能會產生不正確的值順序或太多的值。我會使用命名參數,並將整個字典傳遞給cursor.execute。 – XORcist 2012-08-04 14:14:49

+0

@möter我提供了OP正在做的「更正確」的版本。我同意使用命名參數在一般情況下會稍微好一些。我也希望任何使用線程的人都會警惕使用鎖定。 – 2012-08-04 14:39:00

相關問題