sql >> Databasteknik >  >> RDS >> Mysql

Hur man kontrollerar om posten finns med Python MySQdb

Jag tror att den mest effektiva "finns det"-frågan bara är att göra en count :

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

Istället för att be databasen att utföra några räkneoperationer på fält eller rader, ber du den bara att returnera en 1 eller 0 om resultatet ger några matchningar. Detta är mycket effektivare än att returnera faktiska poster och räkna mängden på klientsidan eftersom det sparar serialisering och deserialisering på båda sidor och dataöverföringen.

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(*) kommer att vara samma som count(1) . I ditt fall, eftersom du skapar en ny tabell, kommer den att visa 1 resultat. Om du har 10 000 matchningar skulle det vara 10 000. Men allt du bryr dig om i ditt test är om det INTE är 0, så du kan utföra ett bool sanningstest.

Uppdatera

Det är faktiskt ännu snabbare att bara använda radräkningen och inte ens hämta resultat:

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

Det är också hur djangos ORM gör en queryObject.exists() .



  1. Arbeta med datum i PostgreSQL

  2. Långsam LEFT JOIN på CTE med tidsintervall

  3. VS 2019 och MySQL Entity Framework dubblerar databasnamn

  4. Slumpmässig PHP FastCGI / Anslutning återställd av peer / ofullständiga rubriker