最も効率的な「存在するか」クエリは、次のことを行うだけだと思います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 でないかどうかだけなので、bool の真偽テストを実行できます。
アップデート
実際には、行数だけを使用し、結果を取得することさえしない方が高速です。
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()
.