ローカルマシンで実行しているpostgresqlデータベースで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)
私のpythonコードはこのデータベースに接続しますが、どのクエリを実行しても、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
私は明らかに間違ったことをしていますか?どうすればこれをデバッグし始めることができますか、うまく接続されているのでどこから始めればよいのかわかりませんか?
cursor.execute
はクエリを準備して実行しますが、データをフェッチしないため、None
は戻り値の型として期待されます。クエリ結果を取得する場合は、次のいずれかのfetch*
メソッドを使用する必要があります。
print cur.fetchone()
rows_to_fetch = 3
print cur.fetchmany(rows_to_fetch)
print cur.fetchall()
カーソルのexecute()
メソッドは、カーソルに渡されたSQLを実行するだけです。次に、カーソルから応答を取得するためのいくつかのオプションがあります。次の結果を返すfetchone()
メソッドを使用できます。初めて呼び出す場合は、最初の結果が得られ、2回目は2番目の結果が得られます。 fetchall()
メソッドはall行を返し、イテレータとして使用できます。
例:
>>> # 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
ドキュメントに記載されているように、次の点に注意してください。 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は、理解を損なうことがなく、私見では、これがより自然に感じられる限り、簡潔なコードを好むはずです。
完璧な例がある基本的なドキュメントを読んでいませんでした
http://initd.org/psycopg/docs/cursor.html
>>> cur.execute("SELECT * FROM test WHERE id = %s", (3,))
>>> cur.fetchone()
(3, 42, 'bar')