2012-10-30 14 views
9

क्या कोई जानता है कि परिणाम सेट के माध्यम से लूपिंग के बिना SQL कीमिया क्वेरी ResultProxy ऑब्जेक्ट से पंक्ति गणना कैसे प्राप्त करें? ResultProxy.rowcount विशेषता 0 दिखाती है, मैं उम्मीद करता हूं कि इसका मूल्य 2 होगा। अपडेट के लिए यह प्रभावित पंक्तियों की संख्या दिखाता है जो मैं अपेक्षा करता हूं।एसक्यूएल कीमिया परिणाम Proxy.rowcount शून्य नहीं होना चाहिए

from sqlalchemy import create_engine 
from sqlalchemy.orm import sessionmaker 

engine = create_engine(
    'oracle+cx_oracle://user:[email protected]:port/database' 
    ) 

session = sessionmaker(
    bind = engine 
    , autocommit = False 
    , autoflush = False 
    )() 

sql_text = u""" 
    SELECT 1 AS Val FROM dual UNION ALL 
    SELECT 2 AS Val FROM dual 
    """ 

results = session.execute(sql_text) 

print '%s rows returned by query...\n' % results.rowcount 
print results.keys() 

for i in results: 
    print repr(i) 

आउटपुट:

0 rows returned by query... 

[u'val'] 
(1,) 
(2,) 

उत्तर

14

resultproxy.rowcount अंततः DBAPI विशेषता cursor.rowcount के लिए एक प्रॉक्सी है। अधिकांश डीबीएपीआई इस विशेषता के माध्यम से एक SELECT क्वेरी के लिए "पंक्तियों की गिनती" प्रदान नहीं करते हैं; इसका प्राथमिक उद्देश्य अद्यतन या हटाए गए बयान से मेल खाने वाली पंक्तियों की संख्या प्रदान करना है। वास्तव में एक संबंधपरक डेटाबेस यह नहीं जानता कि किसी विशेष कथन द्वारा कितनी पंक्तियां वापस की जाएंगी जब तक कि वह उन सभी पंक्तियों को ढूंढने के समाप्त न हो जाए; कई डीबीएपीआई कार्यान्वयन पंक्तियों को वापस करना शुरू कर देंगे क्योंकि डेटाबेस उन्हें बफर किए बिना पाता है, इसलिए उन मामलों में ऐसी कोई गिनती भी उपलब्ध नहीं है।

पंक्तियों की गिनती प्राप्त करने के लिए एक चयन क्वेरी वापस आ जाएगी, आपको या तो एक चयन COUNT (*) ऊपर की ओर करने की आवश्यकता है, या आपको सभी पंक्तियों को सरणी में लाने और सरणी पर लेन() करने की आवश्यकता है।

:

ResultProxy.rowcount पर नोटों इस आगे (http://docs.sqlalchemy.org/en/latest/core/connections.html?highlight=rowcount#sqlalchemy.engine.ResultProxy.rowcount) पर चर्चा - एक अद्यतन बयान, उदाहरण के लिए, हो सकता है

  • इस विशेषता का मिलान नहीं हुआ पंक्तियों की संख्या है, जो जरूरी है कि वास्तव में संशोधित किया गया पंक्तियों की संख्या के समान नहीं है रिटर्न: ResultProxy.rowcount के बारे में

    नोट्स दिए गए पंक्ति पर कोई शुद्ध परिवर्तन नहीं है यदि दिए गए एसईटी मान पंक्ति में मौजूद हैं पहले से ही। ऐसी पंक्ति का मिलान किया जाएगा लेकिन संशोधित नहीं किया जाएगा। बैकएंड पर जो कि दोनों शैलियों, जैसे MySQL, rowcount को सभी मामलों में मिलान गणना वापस करने के लिए डिफ़ॉल्ट रूप से कॉन्फ़िगर किया गया है।

  • ResultProxy.rowcount केवल अद्यतन या डिलीट स्टेटमेंट के संयोजन के साथ उपयोगी है। पाइथन डीबीएपीआई के मुताबिक, यह एक SELECT कथन के परिणामों से उपलब्ध पंक्तियों की संख्या वापस नहीं लौटाता है क्योंकि पंक्तियां अनबफर किए जाने पर डीबीएपीआई इस कार्यक्षमता का समर्थन नहीं कर सकती हैं।

  • ResultProxy.rowcount सभी बोलियों द्वारा पूरी तरह कार्यान्वित नहीं किया जा सकता है। विशेष रूप से, अधिकांश डीबीएपीआई किसी निष्पादन कॉल कॉल से कुल पंक्ति गणना परिणाम का समर्थन नहीं करते हैं। ResultProxy.supports_sane_rowcount() और ResultProxy.supports_sane_multi_rowcount() विधियां बोली से रिपोर्ट करेंगी यदि प्रत्येक उपयोग को समर्थित होने के लिए जाना जाता है।

  • रिटर्निंग का उपयोग करने वाले विवरण सही पंक्ति गणना नहीं दे सकते हैं।
1

आप इस का उपयोग कर सकते हैं:

rowcount = len(results._saved_cursor._result.rows) 

फिर अपने कोड होगा

print '%s rows returned by query...\n' % rowcount 
print results.keys() 

केवल परीक्षण किया 'खोज' प्रश्नों

यह मेरे लिए काम करता है।

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