2012-02-01 10 views
5

लौटने के साथ cursor.rowcount का उपयोग कर अजगर MysqlDB मैं निम्नलिखित कोडSSDictCursor गलत गिनती

cur = db.cursor(cursors.SSDictCursor) 
cur.execute("SELECT * FROM large_table") 
result_count = cur.rowcount 
print result_count 

यह संख्या 18446744073709551615 जो स्पष्ट रूप से गलत है प्रिंट की है। अगर मैं cursors.SSDictCursor को हटाता हूं तो सही संख्या दिखाई देती है। क्या कोई मुझे बता सकता है कि एसएसडीक्ट कर्सर को रखते हुए मैं रिकॉर्ड की संख्या कैसे प्राप्त कर सकता हूं?

उत्तर

3

SSDictCursor के साथ, यह मान केवल तभी पढ़ा जा सकता है। जब कर्सर का उपयोग किया जाता है तो निर्धारित किया जाता है।

आंतरिक रूप से, SSDictCursormysql_use_result() का उपयोग करता है जो सर्वर को अधिग्रहण पूरा होने से पहले डेटा स्थानांतरित करने की अनुमति देता है।

+0

डाउनवॉटिंग के लिए धन्यवाद। समझाने की परवाह? – glglgl

4

, SSDictCursor या SSCursor द्वारा लौटाए गए अभिलेखों की संख्या प्राप्त करने के लिए अपने ही विकल्प हैं:

  1. पूरे परिणाम प्राप्त करें और len(), जो पहली बार में SSDictCursor या SSCursor का उपयोग करने का उद्देश्य धरा का उपयोग कर इसे गिनती जगह;

  2. पंक्तियों की गणना करें जैसे आप उनके माध्यम से पुनरावृत्त करते हैं, जिसका अर्थ है कि आप अंत तक हिट नहीं करेंगे (व्यावहारिक होने की संभावना नहीं है); या,

  3. अतिरिक्त, अलग COUNT(*) क्वेरी चलाएं।

मैं अत्यधिक तीसरे विकल्प की अनुशंसा करता हूं। यदि आप कर रहे हैं तो यह बेहद तेज़ है SELECT COUNT(*) FROM table;। यह कुछ और जटिल क्वेरी के लिए धीमा होगा, लेकिन उचित अनुक्रमण के साथ यह अभी भी अधिकांश उद्देश्यों के लिए पर्याप्त तेज़ होना चाहिए।


एक के रूप में एक तरफ, वापसी मान आप देख रहे हैं सही की तरह है, कम से कम, जहां तक ​​MySQL सी एपीआई का संबंध है।

पीईपी 24 9, the rowcount attribute is -1 if the rowcount of the last operation cannot be determined by the interface में परिभाषित पायथन डीबी एपीआई प्रति। @glglgl समझाया क्यों rowcount उनके जवाब में निर्धारित नहीं किया जा सकता है:

आंतरिक रूप से, SSDictCursor का उपयोग करता mysql_use_result() जो सर्वर से पहले प्राप्त पूरा हो गया है डेटा स्थानांतरित करने शुरू करने के लिए अनुमति देता है।

दूसरे शब्दों में, सर्वर नहीं जानता कि आखिरकार कितनी पंक्तियां लाने जा रही हैं। जब आप कोई क्वेरी निष्पादित करते हैं, तो MySQLdb कर्सर के rowcount विशेषता में mysql_affected_rows() का वापसी मान संग्रहीत करता है।

>>> from ctypes import c_ulonglong 
>>> n = c_ulonglong(-1) 
>>> n.value 
18446744073709551615L 

एक त्वरित और गंदा विकल्प ctypes लिए: क्योंकि गिनती अनिश्चित है, इस समारोह एक अहस्ताक्षरित लंबे पूर्णांक (my_ulonglong), एक अंकीय प्रकार है कि मानक पुस्तकालय की ctypes मॉड्यूल में उपलब्ध है के रूप में -1 रिटर्न , जब आप जानते हैं कि आप हमेशा एक 64-बिट अहस्ताक्षरित पूर्णांक के साथ काम किया जाएगा, है:

>>> -1 & 0xFFFFFFFFFFFFFFFF 
18446744073709551615L 

यह, अगर MySQLdb इस वापसी मान के लिए जाँच की और आप पर हस्ताक्षर किए पूर्णांक को देखने की उम्मीद दे दी है बहुत अच्छा होगा लेकिन दुर्भाग्य से यह नहीं करता है।

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