Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jak sprawdzić, czy rekord istnieje za pomocą Pythona MySQdb

Uważam, że najbardziej wydajnym zapytaniem „czy to istnieje” jest wykonanie count :

sqlq = "SELECT COUNT(1) FROM settings WHERE status = '1'"
xcnx.execute(sqlq)
if xcnx.fetchone()[0]:
    # exists

Zamiast prosić bazę danych o wykonanie jakichkolwiek operacji zliczania na polach lub wierszach, po prostu prosisz ją o zwrócenie 1 lub 0, jeśli wynik da jakiekolwiek dopasowania. Jest to o wiele bardziej wydajne niż zwracanie rzeczywistych rekordów i liczenie ilości po stronie klienta, ponieważ oszczędza serializację i deserializację po obu stronach oraz transfer danych.

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(*) będzie taki sam jak count(1) . W Twoim przypadku, ponieważ tworzysz nową tabelę, pokaże 1 wynik. Jeśli masz 10 000 dopasowań, będzie to 10 000. Ale w teście zależy Ci tylko na tym, czy NIE jest to 0, więc możesz wykonać test prawdy logicznej.

Aktualizacja

W rzeczywistości jeszcze szybciej jest po prostu użyć licznika wierszy, a nawet nie pobrać wyników:

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]: 

W ten sposób ORM django wykonuje queryObject.exists() .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL, aby znaleźć najpopularniejszą kategorię

  2. Wykryto spowolnienie podczas wybierania i kodowania obrazu w bazie 64 z bazy danych

  3. Używając MySql, czy mogę posortować kolumnę, ale 0 jest ostatnie?

  4. Date zwraca wartości null po przesłaniu formularza edycji w php

  5. Dlaczego moja procedura składowana zgłasza błąd „Brak danych — pobrano, wybrano lub przetworzono zero wierszy”, gdy w instrukcji znajduje się WHERE?