2013-09-30 5 views
11

मैं अपने PostgreSQL डेटाबेस सिर्फ अपने स्थानीय मशीन पर चल साथ psycopg2 उपयोग करने के लिए यह कोई फर्क नहीं पड़ता कि मैं क्या करने की कोशिश परिणाम देने के नहीं मिल सकता है कोशिश कर रहा हूँ। ऐसा लगता है कि डेटाबेस से कनेक्ट करने के लिए ठीक है, क्योंकि अगर मैं कॉन्फ़िगरेशन पैरामीटर में से किसी एक को बदलता हूं तो यह त्रुटियों को फेंक देता है, हालांकि, जब मैं प्रतीत होता है कि वैध और परिणाम योग्य प्रश्न पूछता है, तो मुझे कुछ भी नहीं मिलता है।psycopg2 नहीं लौटने परिणाम

मेरे db चल रहा है और निश्चित रूप से किया जाता है उस में एक टेबल है:

postgres=# \c 
You are now connected to database "postgres" as user "postgres". 
postgres=# select * from foos; 
    name | age 
---------+----- 
Sarah | 23 
Michael | 35 
Alice | 12 
James | 20 
John | 52 
(5 rows) 

मेरे अजगर कोड इस डेटाबेस को जोड़ता है, लेकिन कोई बात नहीं क्या क्वेरी मैं चलाने के लिए, मैं None मिलती है:

Python 2.7.3 (default, Apr 10 2013, 06:20:15) 
[GCC 4.6.3] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import psycopg2 
>>> conn = psycopg2.connect("dbname='postgres' user='postgres' host='localhost'") 
>>> cur = conn.cursor() 
>>> print cur.execute("select * from foos;") 
None 
>>> print cur.execute("select * from foos") 
None 
>>> print cur.execute("select name from foos") 
None 
>>> print cur.execute("select f.name from foos f") 
None 

Am मैं कुछ गलत कर रहा हूँ? मैं इसे डिबगिंग कैसे शुरू कर सकता हूं, मुझे नहीं पता कि कहां से शुरू करना है क्योंकि यह ठीक से जुड़ा है?

+1

http://www.python.org/dev/peps/pep-0249/ – Ryan

उत्तर

14

cursor.execute क्वेरी तैयार करता है और निष्पादित करता है लेकिन कोई डेटा नहीं लाता है इसलिए None वापसी प्रकार की उम्मीद है। आप क्वेरी परिणाम प्राप्त करना चाहते हैं, तो आप fetch* एक विधि का उपयोग करने के लिए है:

print cur.fetchone() 

rows_to_fetch = 3 
print cur.fetchmany(rows_to_fetch) 

print cur.fetchall() 
3

की execute() विधि है पढ़ा नहीं था एक कर्सर बस उस SQL ​​को निष्पादित करता है जिसे आप पास करते हैं। आपके पास कर्सर से प्रतिक्रिया प्राप्त करने के लिए कुछ विकल्प हैं। आप fetchone() विधि का उपयोग कर सकते हैं जो अगले परिणाम को वापस कर देगा। पहली बार जब आप इसे कॉल करते हैं तो आपको पहला परिणाम मिलेगा, दूसरी बार दूसरा परिणाम और इसी तरह। fetchall() विधि सभी पंक्तियां लौटाती है और इसे एक पुनरावर्तक के रूप में उपयोग किया जा सकता है।

उदाहरण:

>>> # This is an example of the fetchone() method 
>>> cur.execute("select * from foos") 
>>> # This call will return the first row 
>>> result = cur.fetchone() 
>>> # This call will return the second row 
>>> result = cur.fetchone() 


>>> # This is an example of the fetchall() method 
>>> cur.execute("select * from foos") 
>>> results = cur.fetchall() 
>>> for r in results: 
...  print r 
>>> # Now we'll reset the cursor by re-executing the query 
>>> cur.execute("select * from foos") 
>>> for r in cur.fetchall(): 
...  print r 
5

ध्यान दें, के रूप में यह डॉक्स में कहते हैं: http://initd.org/psycopg/docs/cursor.html "कर्सर वस्तुओं के बजाय एक पाश में स्पष्ट रूप से fetchone बुला() की, iterable हैं, इसलिए, वस्तु ही इस्तेमाल किया जा सकता"

इसलिए, यह बस के रूप में लिखने के लिए मान्य है:

>>> cur.execute("select foo, bar from foobars") 
>>> for foo, bar in cur: 
.... print foo, bar 

स्पष्ट fetchone बुला बिना()। हम pythonistas terse कोड पसंद करते हैं, जब तक यह समझ में कमी नहीं करता है और, imho, यह और अधिक प्राकृतिक लगता है।

+0

यह मेरे मामले में काम नहीं करता है ('कोई नहीं 'वापस आ गया है और मैं पुनरावृत्त नहीं कर सकता)। 'fetchall() 'ठीक काम करता है लेकिन यह करने के लिए यह एक और अधिक पागल तरीका होगा। – PritishC

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