Je pense que la requête "existe-t-elle" la plus efficace est-elle simplement de faire un count
:
sqlq = "SELECT COUNT(1) FROM settings WHERE status = '1'"
xcnx.execute(sqlq)
if xcnx.fetchone()[0]:
# exists
Au lieu de demander à la base de données d'effectuer des opérations de comptage sur des champs ou des lignes, vous lui demandez simplement de renvoyer un 1 ou un 0 si le résultat produit des correspondances. C'est beaucoup plus efficace que de renvoyer les enregistrements réels et de compter le montant côté client, car cela permet d'économiser la sérialisation et la désérialisation des deux côtés, ainsi que le transfert de données.
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(*)
va être le même que count(1)
. Dans votre cas, parce que vous créez une nouvelle table, elle affichera 1 résultat. Si vous avez 10 000 correspondances, ce serait 10 000. Mais tout ce qui vous intéresse dans votre test est de savoir si ce n'est PAS 0, vous pouvez donc effectuer un test de vérité booléen.
Mettre à jour
En fait, il est encore plus rapide d'utiliser simplement le nombre de lignes et de ne même pas récupérer les résultats :
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]:
C'est aussi ainsi que l'ORM de django fait un queryObject.exists()
.