Credo che la query "esiste" più efficiente sia semplicemente eseguire un count
:
sqlq = "SELECT COUNT(1) FROM settings WHERE status = '1'"
xcnx.execute(sqlq)
if xcnx.fetchone()[0]:
# exists
Invece di chiedere al database di eseguire qualsiasi operazione di conteggio su campi o righe, gli stai semplicemente chiedendo di restituire 1 o 0 se il risultato produce corrispondenze. Questo è molto più efficiente rispetto alla restituzione di record effettivi e al conteggio dell'importo lato client perché consente di risparmiare serializzazione e deserializzazione su entrambi i lati e il trasferimento dei dati.
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(*)
sarà lo stesso di count(1)
. Nel tuo caso, poiché stai creando una nuova tabella, mostrerà 1 risultato. Se hai 10.000 corrispondenze sarebbero 10.000. Ma tutto ciò che ti interessa nel tuo test è se NON è 0, quindi puoi eseguire un test di verità bool.
Aggiorna
In realtà, è ancora più veloce utilizzare solo il conteggio delle righe e non recuperare nemmeno i risultati:
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]:
Questo è anche il modo in cui l'ORM di django esegue un queryObject.exists()
.