मैंने कई स्टैक ओवरफ़्लो पोस्ट देखे और उनमें से अधिकांश ने बताया कि VALUES (%s) में डालने पर मुझे tuple या list का उपयोग करने की आवश्यकता है। मैंने सूचियों और टुपल्स दोनों की कोशिश की, लेकिन मुझे अभी भी वही त्रुटि मिल रही है: not all arguments converted during string formatting। PostgreSQL डेटाबेस में कुछ डेटा डालने के लिए उपयोग किए जाने वाले फ़ंक्शन का कोड यहां दिया गया है:

sql = '''
    INSERT INTO immediate_info (
    bytes_sent,
    bytes_recv,
    packets_sent,
    packets_recv,
    errin,
    errout,
    dropin,
    dropout)
    VALUES (%s);
'''

conn = None

bytes_recv, bytes_sent, packets_sent, packets_recv, errin, errout, dropin, dropout = data

try:
    conn = psycopg2.connect('all the connect stuff')
    # create a new cursor
    cur = conn.cursor()
    # execute the INSERT statement
    cur.execute(sql, (bytes_recv, bytes_sent, packets_sent, packets_recv, errin, errout, dropin, dropout,))
    # commit the changes to the database
    conn.commit()
    # close communication with the database
    cur.close()

except (Exception, psycopg2.DatabaseError) as error:

    print(error)

finally:
    if conn is not None:
        conn.close()

जैसा कि मैंने ऊपर उल्लेख किया है, मैंने सूचियों का भी उपयोग करने का प्रयास किया है। इस बार मैंने पहले data सूची को पहले अनपैक करने का फैसला किया, हालांकि केवल इंडेक्स (डेटा [0], डेटा [1], और इसी तरह) का उपयोग करके data सूची के माध्यम से जा रहा है, मेरी राय में, एक ही परिणाम के लिए नेतृत्व।

data में कुछ नेटवर्क जानकारी है जिसका उपयोग मेरे कंप्यूटर की बैंडविड्थ को मापने के लिए किया जाता है। इसकी सभी सामग्री int प्रारूप में है।

साथ ही, यदि आपने गौर किया है, तो यहां स्ट्रिंग स्वरूपण पुराना है (VALUES (%s) का जिक्र करते हुए)। इस मामले में f-फ़ॉर्मेटिंग का उपयोग कैसे किया जा सकता है? और मैं इस त्रुटि से कैसे छुटकारा पा सकता हूं?

1
Guseyn013 22 जिंदा 2021, 17:44
आप मानों में duration पास कर रहे हैं लेकिन यह INSERT कॉलम में सूचीबद्ध नहीं है। तो आठ मान अपेक्षित हैं और आप नौ पास कर रहे हैं।
 – 
snakecharmerb
22 जिंदा 2021, 19:03
क्षमा करें, यह प्रश्न में ही गलती थी, कोड नहीं। मैं बस इसे संपादित करना भूल गया। अब सवाल सही है, मुझे उम्मीद है। समस्या अभी भी बनी हुई है।
 – 
Guseyn013
22 जिंदा 2021, 19:05
फिर वास्तविक कोड और त्रुटि दिखाने के लिए प्रश्न को संपादित करें करें। और जागरूक रहें, एफ-स्ट्रिंग्स (या किसी अन्य प्रकार की स्ट्रिंग स्वरूपण) का उपयोग करना एसक्यूएल प्रश्नों में मूल्यों को इंजेक्ट करने का एक सुरक्षित तरीका नहीं है।
 – 
snakecharmerb
22 जिंदा 2021, 19:06
मैंने इसे अभी संपादित किया है। इसके अलावा, फिर बेहतर तरीका क्या है? या इसके बारे में पूछने के लिए टिप्पणियाँ सबसे अच्छी जगह नहीं हैं?
 – 
Guseyn013
22 जिंदा 2021, 19:08
2
क्षमा करें, मैं कल सो रहा होगा! vlaues क्लॉज में "%s" की संख्या भी सम्मिलित किए जाने वाले कॉलम की संख्या से मेल खाना चाहिए, इसलिए आपका कोड ... VALUES(%s, %s, %s, %s, %s, %s, %s, %s) होना चाहिए, यह मानते हुए कि आप आठ कॉलम डाल रहे हैं।
 – 
snakecharmerb
23 जिंदा 2021, 20:12

1 उत्तर

सबसे बढ़िया उत्तर

cursor.execute का उपयोग करके INSERT कथन निष्पादित करते समय

  • सम्मिलित किए जाने वाले स्तंभों की संख्या VALUES खंड में प्लेसहोल्डर्स की संख्या से मेल खानी चाहिए
  • cursor.execute के दूसरे तर्क में तत्वों की संख्या VALUES खंड में प्लेसहोल्डर्स की संख्या से मेल खाना चाहिए

इसलिए

cursor.execute("""INSERT INTO foo (bar, baz, quux) VALUES (%s, %s)""", args)

गलत है क्योंकि तीन कॉलम डाले जा रहे हैं लेकिन केवल दो मान प्लेसहोल्डर हैं

तथा

cursor.execute("""INSERT INTO foo (bar, baz, quux) VALUES (%s, %s, %s)""",
               ('a', 'b', 'c', 'd'))

गलत है क्योंकि दूसरे तर्क में मानों की संख्या VALUES खंड में प्लेसहोल्डर की संख्या से मेल नहीं खाती।

2
snakecharmerb 23 जिंदा 2021, 21:21