2012-08-04 16 views
10

कल्पना कीजिए कि आपके पास बड़ी मात्रा में आइटम के साथ एक महत्वपूर्ण मूल्य पायथन शब्दकोश (या सूची) है। आइए मान लें कि आप एक बड़ी JSON फ़ाइल पढ़ रहे हैं और आप इसकी सामग्री को MySQL तालिका में कुंजी के साथ कॉलम और मानों के नाम के रूप में कुंजी के रूप में स्टोर करना चाहते हैं।एसक्यूएल डेटाबेस में पायथन शब्दकोश/सूचियों को सम्मिलित करने का सबसे प्रभावी तरीका क्या है?

JSON उदाहरण:

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

(ठीक है, यह पाँच मूल्यों के साथ ठीक है, लेकिन सोच भी वहाँ उदाहरण पाँच के लिए कर रहे हैं:

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

तो यह इस मैन्युअल रूप से की तरह एसक्यूएल डालने लिखने के लिए काफी अक्षम है उनमें से सैकड़ों।)

क्या प्रभावी और शॉर्ट-स्ट्रिंग एसक्यूएल डालने के लिए कोई पायथन कक्षा/विधि है?

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 स्ट्रिंग के साथ एक ही सरल दृष्टिकोण में कई मानों को सम्मिलित करने के तरीके है?

+1

यदि आप एक रिलेशनल डेटाबेस का उपयोग करना चाहते हैं, तो शायद आगामी PostgreSQL 9.2 का उपयोग करें जिसमें मूल JSON डेटाटाइप है। –

उत्तर

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

+1 'instinstance' –

+0

पर +1 यदि किसी दूसरे धागे में निर्देश संशोधित किया गया है, तो यह मानों का गलत क्रम या बहुत अधिक मूल्य उत्पन्न कर सकता है। मैं इसके बजाय नामित पैरामीटर के साथ जाऊंगा और पूरे शब्दकोश को कर्सर.एक्सक्यूट पर भेज दूंगा। – XORcist

+0

@ मॉटर मैं ओपी क्या कर रहा था के "अधिक सही" संस्करण की पेशकश कर रहा था। मैं सहमत हूं कि नामित पैरामीटर का उपयोग सामान्य रूप से कुछ हद तक बेहतर है। मैं यह भी उम्मीद करता हूं कि थ्रेड का उपयोग करने वाले किसी भी व्यक्ति को लॉकिंग का उपयोग करने के लिए पर्याप्त सावधान रहना होगा। –

संबंधित मुद्दे

 संबंधित मुद्दे