मैं एक शब्दकोश से पायथन का उपयोग कर एक MySQL तालिका में डेटा जोड़ने की कोशिश कर रहा हूं। मेरा शब्दकोश विभिन्न लंबाई की मूल्य सूचियों से जुड़ी चाबियों से बना है - कहीं भी 1 से 150 या उससे अधिक की लंबाई से। मैं अपना डेटा उस तालिका में सम्मिलित करने के लिए एक सम्मिलित कथन का उपयोग कर रहा हूँ जहाँ कुंजियाँ फ़ील्ड नाम हैं। यही वह है जो मैं चाहता हूं कि एसक्यूएल इंसर्ट स्टेटमेंट मूल रूप से हो:

INSERT INTO table
(key1, key2, key3, ...)
VALUES
(key1value1, key2value1, key3value1, ...),
(key1value2, key2value2, key3value2, ...),
(key1value3, key2value3, key3value3, ...);

और इसी तरह, लेकिन मूल्यों के प्रति सेट एक सम्मिलित विवरण रखने के लिए मैं लूप के लिए भी ठीक हूं। मेरी सूचियों के पहले तत्वों के लिए मेरे पास यह है:

cols = dict.keys()
vals = dict.values()
lst = [item[0] for item in vals]
sql = "INSERT INTO table (%s) VALUES (%s);" % (','.join(map(str, cols[:len(cols)])), "'{}'".format("','".join(lst)))
cursor.execute(sql)

और यह काम करता है, मेरी तालिका में एक नई पंक्ति में डेटा का पहला सेट प्रभावी ढंग से सम्मिलित करता है। लेकिन समस्या यह है कि जब मैं एलएसटी में इंडेक्स को बढ़ाने की कोशिश करता हूं, उदाहरण के लिए आइटम [1], यह कहता है कि इंडेक्स सीमा से बाहर है क्योंकि मेरे पास केवल एक तत्व के साथ कुछ सूचियां हैं। और चूंकि सूचियां सभी अलग-अलग लंबाई की हैं, इसलिए मुझे इसे सामान्य बनाने की आवश्यकता है ताकि यह हमेशा काम करे, हालांकि प्रत्येक सूची में कितने तत्व हैं।

यदि सूचकांक कुछ सूचियों के लिए सीमा से बाहर है तो यह बढ़ता है तो मैं चाहता हूं कि यह उनको छोड़ दें लेकिन बाकी को सम्मिलित करना जारी रखें। मैं उसको कैसे करू?

1
curious_cosmo 25 अगस्त 2017, 01:39
1
बस एक मामूली नोट: प्रश्नों को संशोधित करते समय स्ट्रिंग स्वरूपण के बजाय तैयार कथन का उपयोग करें।
 – 
MSeifert
25 अगस्त 2017, 01:41

2 जवाब

पहला उदाहरण आपको शब्दकोश में प्रत्येक मान का ith तत्व देगा, सबसे छोटी सूची समाप्त होने पर पूरी तरह से रुक जाएगा।

दूसरा उदाहरण चलता रहेगा, और केवल एक None मान का उपयोग करें जहां एक सूची बहुत छोटी है।

from itertools import zip_longest

d = {'k1':[1,2,3],
     'k2':[1,2,3,4,5,6],
     'k3':[1,8]}

for k in d.keys():
    for v in zip(*d.values()):
        print(k,v)

for k in d.keys():
    for v in zip_longest(*d.values()):
        print(k,v)
0
Solaxun 25 अगस्त 2017, 02:11
data = { 'a': [1], 'b': [1, 2], 'c': [1, 2, 3] }

keys = ', '.join(data.keys())
values = ', '.join('(' + ', '.join(v) + ')' for v in (map(str, value) for value in data.values()))

print(keys)
print(values)

उत्पादन करता है:

a, b, c
(1), (1, 2), (1, 2, 3)

मुझे पूरा यकीन है कि एसक्यूएल एक कॉलम में एकाधिक मानों की अनुमति नहीं देता है, हालांकि।

0
Alex Undefined 25 अगस्त 2017, 02:14