Ik geloof dat de meest efficiënte "bestaat het"-query gewoon een count
is :
sqlq = "SELECT COUNT(1) FROM settings WHERE status = '1'"
xcnx.execute(sqlq)
if xcnx.fetchone()[0]:
# exists
In plaats van de database te vragen om telbewerkingen op velden of rijen uit te voeren, vraagt u hem alleen om een 1 of 0 te retourneren als het resultaat overeenkomsten oplevert. Dit is veel efficiënter dan het retourneren van werkelijke records en het tellen van het bedrag aan de clientzijde, omdat het serialisatie en deserialisatie aan beide zijden en de gegevensoverdracht bespaart.
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(*)
zal hetzelfde zijn als count(1)
. In jouw geval, omdat je een nieuwe tabel aan het maken bent, zal deze 1 resultaat tonen. Als je 10.000 overeenkomsten hebt, zou het 10000 zijn. Maar het enige waar je in je test om geeft, is of het NIET 0 is, dus je kunt een bool-waarheidstest uitvoeren.
Bijwerken
Het is zelfs nog sneller om gewoon het aantal rijen te gebruiken en zelfs geen resultaten op te halen:
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]:
Dit is ook hoe de ORM van django een queryObject.exists()
doet .