Ich glaube, die effizienteste "existiert es"-Abfrage besteht darin, einfach eine count
durchzuführen :
sqlq = "SELECT COUNT(1) FROM settings WHERE status = '1'"
xcnx.execute(sqlq)
if xcnx.fetchone()[0]:
# exists
Anstatt die Datenbank aufzufordern, Zähloperationen für Felder oder Zeilen durchzuführen, bitten Sie sie lediglich, eine 1 oder 0 zurückzugeben, wenn das Ergebnis Übereinstimmungen ergibt. Dies ist viel effizienter als das Zurückgeben tatsächlicher Datensätze und das Zählen der Menge auf der Clientseite, da es die Serialisierung und Deserialisierung auf beiden Seiten und die Datenübertragung spart.
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(*)
wird dasselbe sein wie count(1)
. Da Sie in Ihrem Fall eine neue Tabelle erstellen, wird 1 Ergebnis angezeigt. Wenn Sie 10.000 Übereinstimmungen haben, wären es 10.000. Aber alles, was Sie in Ihrem Test interessiert, ist, ob es NICHT 0 ist, also können Sie einen booleschen Wahrheitstest durchführen.
Aktualisieren
Tatsächlich ist es sogar noch schneller, nur die Zeilenanzahl zu verwenden und nicht einmal Ergebnisse abzurufen:
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]:
Auf diese Weise führt das ORM von Django auch ein queryObject.exists()
aus .