Uważam, że najbardziej wydajnym zapytaniem „czy to istnieje” jest wykonanie count
:
sqlq = "SELECT COUNT(1) FROM settings WHERE status = '1'"
xcnx.execute(sqlq)
if xcnx.fetchone()[0]:
# exists
Zamiast prosić bazę danych o wykonanie jakichkolwiek operacji zliczania na polach lub wierszach, po prostu prosisz ją o zwrócenie 1 lub 0, jeśli wynik da jakiekolwiek dopasowania. Jest to o wiele bardziej wydajne niż zwracanie rzeczywistych rekordów i liczenie ilości po stronie klienta, ponieważ oszczędza serializację i deserializację po obu stronach oraz transfer danych.
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(*)
będzie taki sam jak count(1)
. W Twoim przypadku, ponieważ tworzysz nową tabelę, pokaże 1 wynik. Jeśli masz 10 000 dopasowań, będzie to 10 000. Ale w teście zależy Ci tylko na tym, czy NIE jest to 0, więc możesz wykonać test prawdy logicznej.
Aktualizacja
W rzeczywistości jeszcze szybciej jest po prostu użyć licznika wierszy, a nawet nie pobrać wyników:
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]:
W ten sposób ORM django wykonuje queryObject.exists()
.