Tôi tin rằng truy vấn "nó có tồn tại" hiệu quả nhất chỉ là thực hiện count
:
sqlq = "SELECT COUNT(1) FROM settings WHERE status = '1'"
xcnx.execute(sqlq)
if xcnx.fetchone()[0]:
# exists
Thay vì yêu cầu cơ sở dữ liệu thực hiện bất kỳ hoạt động đếm nào trên các trường hoặc hàng, bạn chỉ yêu cầu nó trả về 1 hoặc 0 nếu kết quả tạo ra bất kỳ kết quả phù hợp nào. Điều này hiệu quả hơn nhiều khi trả về các bản ghi thực tế và đếm số lượng phía máy khách vì nó tiết kiệm tuần tự hóa và giải mã hóa ở cả hai phía cũng như truyền dữ liệu.
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(*)
sẽ giống với count(1)
. Trong trường hợp của bạn vì bạn đang tạo một bảng mới, nó sẽ hiển thị 1 kết quả. Nếu bạn có 10.000 kết quả phù hợp, nó sẽ là 10000. Nhưng tất cả những gì bạn quan tâm trong bài kiểm tra của mình là nó CÓ phải là 0 hay không, vì vậy bạn có thể thực hiện kiểm tra độ thật giả.
Cập nhật
Trên thực tế, thậm chí còn nhanh hơn nếu chỉ sử dụng số lượng hàng và thậm chí không tìm nạp kết quả:
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]:
Đây cũng là cách ORM của django thực hiện queryObject.exists()
.