我相信最有效的“它是否存在”查询只是做一个count
:
sqlq = "SELECT COUNT(1) FROM settings WHERE status = '1'"
xcnx.execute(sqlq)
if xcnx.fetchone()[0]:
# exists
如果结果产生任何匹配,您只需要求它返回 1 或 0,而不是要求数据库对字段或行执行任何计数操作。这比返回实际记录并计算客户端的数量要高效得多,因为它节省了双方的序列化和反序列化以及数据传输。
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(*)
将与 相同count(1)
。在您的情况下,因为您正在创建一个新表,它将显示 1 个结果。如果您有 10,000 个匹配项,它将是 10000 个。但是您在测试中关心的是它是否不是 0,因此您可以执行布尔真值测试。
更新
实际上,只使用行数甚至不获取结果会更快:
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]:
这也是 django 的 ORM 执行queryObject.exists()
.