सर्वर-साइड कर्सर के मामले में, हालांकि cursor.execute()
रिटर्न, जरूरी नहीं कि क्वेरी उस समय सर्वर द्वारा निष्पादित की गई हो, और इसलिए पंक्ति गणना psycopg2
के लिए उपलब्ध नहीं है . यह DBAPI 2.0 spec
के अनुरूप है जो बताता है कि rowcount
यदि अंतिम ऑपरेशन की पंक्ति संख्या अनिश्चित है तो -1 होना चाहिए।
इसे cursor.fetchone()
. के साथ जबरदस्ती करने का प्रयास , उदाहरण के लिए, अपडेट cursor.rowcount
, लेकिन केवल पुनर्प्राप्त की गई वस्तुओं की संख्या से, ताकि यह उपयोगी न हो। cursor.fetchall()
परिणाम rowcount
. होगा हालांकि, सही ढंग से सेट किया जा रहा है, जो उस डेटा की पूरी क्वेरी और हस्तांतरण करता है जिसे आप टालना चाहते हैं।
एक संभावित समाधान जो गिनती प्राप्त करने के लिए पूरी तरह से अलग क्वेरी से बचता है, और जो सटीक परिणाम देता है वह है:
select *, (select count(*) from test) from test;
इसके परिणामस्वरूप प्रत्येक पंक्ति में अंतिम कॉलम के रूप में तालिका पंक्ति गणना संलग्न होगी। फिर आप cursor.fetchone()
. का उपयोग करके तालिका पंक्ति गणना प्राप्त कर सकते हैं और फिर अंतिम कॉलम लेना:
with db.cursor('cursor_name') as cursor:
cursor.execute('select *, (select count(*) from test) from test')
row = cursor.fetchone()
data, count = row[:-1], row[-1]
अब count
तालिका में पंक्तियों की संख्या होगी। आप row[:-1]
का उपयोग कर सकते हैं पंक्ति डेटा को संदर्भित करने के लिए।
यह क्वेरी को धीमा कर सकता है क्योंकि संभवतः महंगा SELECT COUNT(*)
प्रदर्शन किया जाएगा, लेकिन एक बार हो जाने के बाद डेटा पुनर्प्राप्त करना तेज़ होना चाहिए।