Jag tror att den mest effektiva "finns det"-frågan bara är att göra en count
:
sqlq = "SELECT COUNT(1) FROM settings WHERE status = '1'"
xcnx.execute(sqlq)
if xcnx.fetchone()[0]:
# exists
Istället för att be databasen att utföra några räkneoperationer på fält eller rader, ber du den bara att returnera en 1 eller 0 om resultatet ger några matchningar. Detta är mycket effektivare än att returnera faktiska poster och räkna mängden på klientsidan eftersom det sparar serialisering och deserialisering på båda sidor och dataöverföringen.
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(*)
kommer att vara samma som count(1)
. I ditt fall, eftersom du skapar en ny tabell, kommer den att visa 1 resultat. Om du har 10 000 matchningar skulle det vara 10 000. Men allt du bryr dig om i ditt test är om det INTE är 0, så du kan utföra ett bool sanningstest.
Uppdatera
Det är faktiskt ännu snabbare att bara använda radräkningen och inte ens hämta resultat:
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]:
Det är också hur djangos ORM gör en queryObject.exists()
.