サーバー側カーソルの場合、cursor.execute()
が返される場合、クエリはその時点でサーバーによって必ずしも実行されていないため、psycopg2
は行数を使用できません。 。これは、DBAPI2.0仕様
と一致しています。 rowcount
最後の操作の行数が不確定な場合は-1にする必要があります。
cursor.fetchone()
で強制しようとします たとえば、cursor.rowcount
を更新します 、ただし、取得されたアイテムの数だけであるため、これは役に立ちません。 cursor.fetchall()
結果はrowcount
になります ただし、正しく設定されていると、回避しようとしているデータの完全なクエリと転送が実行されます。
カウントを取得するための完全に別個のクエリを回避し、正確な結果が得られる可能性のある回避策は次のとおりです。
select *, (select count(*) from test) from test;
これにより、各行の最終列としてテーブルの行数が追加されます。次に、cursor.fetchone()
を使用してテーブルの行数を取得できます。 そして最後の列を取ります:
with db.cursor('cursor_name') as cursor:
cursor.execute('select *, (select count(*) from test) from test')
row = cursor.fetchone()
data, count = row[:-1], row[-1]
今count
テーブルの行数が含まれます。 row[:-1]
を使用できます 行データを参照します。
SELECT COUNT(*)
が高額になる可能性があるため、クエリの速度が低下する可能性があります。 実行されますが、完了したらデータの取得は高速である必要があります。