Вярвам, че най-ефективната заявка "съществува ли" е просто да се направи 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 съвпадения, това ще бъде 10 000. Но всичко, което ви интересува във вашия тест, е дали НЕ е 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]:
Също така ORM на django прави queryObject.exists()
.