最も効率的な「存在する」クエリは、count
を実行することだと思います。 :
sqlq = "SELECT COUNT(1) FROM settings WHERE status = '1'"
xcnx.execute(sqlq)
if xcnx.fetchone()[0]:
# exists
データベースにフィールドまたは行のカウント操作を実行するように要求する代わりに、結果が一致する場合は1または0を返すようにデータベースに要求するだけです。これは、実際のレコードを返し、クライアント側で量をカウントするよりもはるかに効率的です。これにより、両側でのシリアル化と逆シリアル化、およびデータ転送が節約されます。
In [22]: c.execute("select count(1) from settings where status = 1")
Out[22]: 1L # rows
In [23]: c.fetchone()[0]
Out[23]: 1L # count found a match
In [24]: c.execute("select count(1) from settings where status = 2")
Out[24]: 1L # rows
In [25]: c.fetchone()[0]
Out[25]: 0L # count did not find a match
count(*)
count(1)
と同じになります 。あなたの場合、新しいテーブルを作成しているので、1つの結果が表示されます。 10,000の一致がある場合、10000になります。ただし、テストで気になるのは、0でないかどうかだけなので、ブール値の真理テストを実行できます。
更新
実際には、行数を使用するだけで、結果をフェッチすることすらしない方がさらに高速です。
In [15]: if c.execute("select (1) from settings where status = 1 limit 1"):
print True
True
In [16]: if c.execute("select (1) from settings where status = 10 limit 1"):
print True
In [17]:
これは、djangoのORMがqueryObject.exists()
を実行する方法でもあります。 。