質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

19378閲覧

Python SQLiteでSELECT結果の件数の取得方法

WMS

総合スコア37

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2019/05/21 13:04

編集2019/05/21 13:05

SELECT結果の件数を取得したいのですが、print関数で件数を取得すると、2回目の件数が0件になってしまいます。
fetchallの仕様かなと思うのですが、この場合どうコーディングすればよいか教えて頂けないでしょうか。
よろしくお願い致します。

python

1sql = "SELECT * FROM tmp" 2cur = conn.cursor() 3cur.execute(sql) 4 5print(len(cur.fetchall())) # 件数を取得できる 6if len(cur.fetchall()) == 0: 7 print(len(cur.fetchall())) # 0件になる 8 tkm.showwarning('警告','0件のため取込できません。') 9

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

おそらくですが、同じ条件で2回fetchallを行っているからだと思います。
一度目のfetchallで、その条件に当てはまる全てのデータがフェッチされ、二度目のフェッチでは、フェッチするものが残っていないためそのようになっているのだと思います。

その場合は、
fetchallで取得できるデータを一度変数で受け取って繰り返し利用した方がいいかと思います。

または

cur.close() cur = conn.cursor()

としてカーソルを一旦クローズすることでリセットさせてもできるかと思います。

投稿2019/05/21 15:20

編集2019/05/21 15:27
keip

総合スコア33

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

fetchall すると残りのクエリ結果をすべて取得するので、fetchall を実行した直後に再度実行すると何も値は返りません。

まず件数を取得したい場合は select count(*) from tmp のようにsqliteの count 関数を使った方が効率がよいです。この場合は fetchone で返される値がそのまま件数になります。クエリ結果は1つしかないので、fetchall を使う必要はありません。

それで、もう一度取得したい場合は同じクエリでもう一回 execute すればいいです。

投稿2019/05/21 15:52

krtx

総合スコア121

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

WMS

2019/05/22 02:59

ご回答ありがとうございます。 質問を投稿した後、このやり方も考えたのですが、SQLを2回実行することに違和感を感じており、ほかに方法おがないか調査しておりました。 ご教授頂いた方法は、ケースバイケースでデータ件数だけを返すような共通関数を作成する手もありですね、参考にさせて頂きます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問