Jeg tror, at den mest effektive "eksisterer det"-forespørgsel bare er at foretage en count
:
sqlq = "SELECT COUNT(1) FROM settings WHERE status = '1'"
xcnx.execute(sqlq)
if xcnx.fetchone()[0]:
# exists
I stedet for at bede databasen om at udføre tælleoperationer på felter eller rækker, beder du den bare om at returnere et 1 eller 0, hvis resultatet giver nogen match. Dette er meget mere effektivt end at returnere faktiske poster og tælle mængden på klientsiden, fordi det sparer serialisering og deserialisering på begge sider og dataoverførslen.
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(*)
vil være det samme som count(1)
. I dit tilfælde, fordi du opretter en ny tabel, vil den vise 1 resultat. Hvis du har 10.000 matches ville det være 10.000. Men alt hvad du bekymrer dig om i din test er, om den IKKE er 0, så du kan udføre en bool sandhedstest.
Opdater
Faktisk er det endnu hurtigere bare at bruge rækketællingen og ikke engang hente resultater:
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 er også sådan django's ORM laver en queryObject.exists()
.