2013-09-30 6 views
11

psycopg2 내 로컬 컴퓨터에서 실행중인 postgresql 데이터베이스를 사용해도 시도 할 때 결과를 반환 할 수 없습니다. 그것은 데이터베이스에 연결하는 것 같다. 왜냐하면 내가 config 매개 변수 중 하나를 변경하면 오류가 발생하지만, 겉으로보기에는 유효하고 결과가 좋은 쿼리를 실행할 때 아무것도 얻지 못하기 때문이다. 내 DB를 확실히 실행하고psycopg2가 결과를 반환하지 않습니다.

그 안에 테이블이 있습니다

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 

오전 나는 분명히 잘못된 것을하고있는 중입니까? 이 디버깅을 시작하려면 어떻게해야할까요? 연결이 잘된 이후로 어디에서 시작해야할지 모르겠습니다.

+1

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

답변

14

cursor.execute은 쿼리를 준비하고 실행하지만 어떤 데이터도 가져 오지 않으므로 None이 예상되는 반환 유형입니다. 당신은 완벽한 예

http://initd.org/psycopg/docs/cursor.html

>>> cur.execute("SELECT * FROM test WHERE id = %s", (3,)) 
>>> cur.fetchone() 
(3, 42, 'bar') 
1

: 당신은 쿼리 결과를 검색 할 경우에 당신은 fetch* 방법 중 하나를 사용해야합니다 커서는 단순히 전달하는 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 
3

execute() 메소드가 기본 문서를 읽어 보지 않았

print cur.fetchone() 

rows_to_fetch = 3 
print cur.fetchmany(rows_to_fetch) 

print cur.fetchall() 
5

참고가 문서에서 말한대로 : http://initd.org/psycopg/docs/cursor.html

"커서 오브젝트 대신 루프) (명시 적 대하여 fetchone 호출하는 반복 가능한, 그래서, 개체 자체를 사용할 수 있습니다"

는 따라서 쓸만큼 유효 :

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

명시 적 대하여 fetchone를 호출하지 않고(). 우리 pythonistas는 이해를 손상시키지 않는 한 간결한 코드를 선호하기로되어 있으며, 더 자연 스럽다고 느낍니다.

+0

내 경우에는 작동하지 않는 것 같습니다 ('없음'이 반환되고 반복 할 수 없음). 'fetchall()'은 정상적으로 작동하지만 좀 더 파이썬적인 방법 일 것입니다. – PritishC

관련 문제