2008-08-03 33 views
34

परिणाम सेट पर पुन: प्रयास करने के कई तरीके हैं। प्रत्येक का व्यापार क्या है?cx_Oracle: मैं परिणाम सेट पर फिर से कैसे सक्रिय करूं?

+1

इसका अपवाद है, लेकिन अंगूठे का सामान्य नियम हैं है: यदि ऐसा करने के एक से अधिक तरीके हैं, तो शायद यह है कि प्रत्येक तरह अलग-अलग स्थितियों के लिए उपयुक्त है।अन्यथा केवल एक ही रास्ता होगा। दूसरी विधि के बारे में –

उत्तर

34

अंतर्निहित कर्सर इटरेटर का उपयोग करने के लिए कैननिकल तरीका है।

curs.execute('select * from people') 
for row in curs: 
    print row 

आप fetchall() का उपयोग एक ही बार में सभी पंक्तियां प्राप्त कर सकते हैं।

for row in curs.fetchall(): 
    print row 

यह इस का उपयोग करने के मूल्यों से युक्त एक अजगर सूची बनाने के लिए सुविधाजनक हो सकता है लौटे:

curs.execute('select first_name from people') 
names = [row[0] for row in curs.fetchall()] 

इस छोटे परिणाम सेट के लिए उपयोगी हो सकता है, लेकिन बुरा दुष्प्रभाव हो सकते हैं, तो परिणाम सेट बड़ा है।

  • आप पूरे अपने ग्राहक प्रक्रिया को लौटा दी करने के लिए सेट परिणाम के लिए इंतजार करना पड़ता है।

  • आप अपने क्लाइंट में बिल्ट-अप सूची रखने के लिए बहुत मेमोरी खा सकते हैं।

  • पाइथन के लिए सूची बनाने और इसे रद्द करने में कुछ समय लग सकता है जिसे आप तुरंत किसी भी तरह से त्यागने जा रहे हैं।


यदि आप जानते हैं वहाँ एक ही पंक्ति परिणाम सेट आप fetchone() फोन एकल पंक्ति पाने के लिए कर सकते हैं में वापस लौटाए जा रहे हैं।

curs.execute('select max(x) from t') 
maxValue = curs.fetchone()[0] 

अंत में, आप परिणाम पर पाश एक समय में एक पंक्ति को लाते समय सेट कर सकते हैं। सामान्यतः, इटरेटर का उपयोग करने में ऐसा करने में कोई विशेष फायदा नहीं होता है।

row = curs.fetchone() 
while row: 
    print row 
    row = curs.fetchone() 
+1

, यदि आप एक एसएससीसर का उपयोग करते हैं तो क्या होगा? क्या यह बहुत सारी मेमोरी खाएगा? – Sylvain

+0

मुझे लगता है कि एसएससीसर MySQL के लिए है। लेकिन कुछ भी जो fetchall() है, शायद एक ही स्मृति उपयोग होगा, क्योंकि यह लौटाई गई सभी पंक्तियों की एक सूची देता है। –

4

नहीं है भी तरह से psyco-pg यह करने के लिए ... से मैं क्या इकट्ठा होते हैं, यह शब्दकोश की तरह रो-प्रॉक्सी बनाने के लिए स्मृति क्वेरी द्वारा रिटर्न ब्लॉक में कुंजी देखने मैप करने के लिए लगता है लगता है। उस स्थिति में, पूरे उत्तर को प्राप्त करना और पंक्तियों पर समान प्रॉक्सी-फैक्ट्री के साथ काम करना उपयोगी विचार जैसा लगता है। हालांकि इसके बारे में सोचने के लिए आओ, यह पाइथन की तुलना में लुआ की तरह लगता है।

इसके अलावा, यह सब PEP-249 DBAPI2.0 इंटरफेस ही नहीं, ओरेकल के लिए लागू किया जाना चाहिए, या तुम सिर्फ सबसे तेजी सेओरेकल का उपयोग कर मतलब था?

21

मेरा पसंदीदा तरीका कर्सर इटरेटर है, लेकिन पहले कर्सर की सरणीकरण संपत्ति सेट करना।

curs.execute('select * from people') 
curs.arraysize = 256 
for row in curs: 
    print row 

इस उदाहरण में, cx_Oracle एक समय में 256 पंक्तियों ओरेकल से पंक्तियों लायेगा, नेटवर्क दौर यात्राएं प्रदर्शन करने की जरूरत है की संख्या को कम

+2

मेरे परीक्षणों में (लैन से जुड़े डेटाबेस पर) यह वास्तव में 'fetchone()' बार-बार करने की तुलना में समान (यहां तक ​​कि धीमे, दो पुनरावृत्तियों में) गति देना प्रतीत होता था। मैं इसे लगभग 12000 प्रविष्टियों के साथ कर रहा था ... बहुत अजीब! –

+0

मुझे पता है कि एकमात्र तरीका है, और मैं ओरेकल विशेषज्ञ नहीं हूं, यह मामला यह होगा कि यदि आपकी क्वेरी चरित्र बड़ी वस्तु (सीएलओबी) या बाइनरी बड़ी वस्तु (बीएलओबी) प्रकार लौट रही है। AFAI इसे समझें, इन ऑब्जेक्ट्स को पढ़ने के लिए प्रत्येक रिकॉर्ड के लिए डीबी सर्वर पर एक और नेटवर्क राउंड ट्रिप की आवश्यकता होती है; जिसका अर्थ है कि fetchmany के साथ आप वास्तव में दोनों दुनिया के सबसे खराब हो जाते हैं। – asmoore82

+0

cx_Oracle के लिए, मानक कॉलम प्रकारों (कोई क्लब्स इत्यादि) के साथ एक 12 सी डेटाबेस से कनेक्ट करने के लिए मुझे एक स्पीडअप मिलती है, लेकिन केवल तभी जब मैं क्वेरी को निष्पादित करने से पहले * arraysize * सेट करता हूं। सटीक संख्या स्पष्ट रूप से बड़े पैमाने पर संदर्भ निर्भर होंगे लेकिन परिमाण परिवर्तन के क्रम का विचार देने के लिए, मेरी क्वेरी (5 कॉलम लौटाई जा रही है) arraysize = 50 (डिफ़ॉल्ट) के साथ 3.75us प्रति पंक्ति देता है। 1 से कम करने के लिए arraysize 70us देता है। 1000 तक बढ़ने वाले arraysize 800ns – FredL