Acredito que a consulta "existe" mais eficiente é apenas fazer um
count
:sqlq = "SELECT COUNT(1) FROM settings WHERE status = '1'"
xcnx.execute(sqlq)
if xcnx.fetchone()[0]:
# exists
Em vez de pedir ao banco de dados para executar qualquer operação de contagem em campos ou linhas, você está apenas solicitando que ele retorne 1 ou 0 se o resultado produzir alguma correspondência. Isso é muito mais eficiente do que retornar registros reais e contar a quantidade do lado do cliente, pois economiza serialização e desserialização em ambos os lados, além da transferência de dados.
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(*)
será igual a count(1)
. No seu caso, porque você está criando uma nova tabela, ela mostrará 1 resultado. Se você tiver 10.000 correspondências, seriam 10.000. Mas tudo o que importa em seu teste é se NÃO é 0, então você pode realizar um teste de verdade bool. Atualizar
Na verdade, é ainda mais rápido usar apenas o número de linhas e nem mesmo buscar resultados:
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]:
É também assim que o ORM do django faz um
queryObject.exists()
.