sql >> Database teknologi >  >> RDS >> Mysql

Sådan kontrollerer du, om posten findes med Python MySQdb

Jeg tror, ​​at den mest effektive "eksisterer det"-forespørgsel bare er at foretage en count :

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

I stedet for at bede databasen om at udføre tælleoperationer på felter eller rækker, beder du den bare om at returnere et 1 eller 0, hvis resultatet giver nogen match. Dette er meget mere effektivt end at returnere faktiske poster og tælle mængden på klientsiden, fordi det sparer serialisering og deserialisering på begge sider og dataoverførslen.

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(*) vil være det samme som count(1) . I dit tilfælde, fordi du opretter en ny tabel, vil den vise 1 resultat. Hvis du har 10.000 matches ville det være 10.000. Men alt hvad du bekymrer dig om i din test er, om den IKKE er 0, så du kan udføre en bool sandhedstest.

Opdater

Faktisk er det endnu hurtigere bare at bruge rækketællingen og ikke engang hente resultater:

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 er også sådan django's ORM laver en queryObject.exists() .



  1. Hvordan bruger man AJAX til at uploade en stor CSV-fil?

  2. Konverter den nye række til XML inde i en Oracle Trigger

  3. SQL Server brugerdefinerede funktioner

  4. CDbCommand::fetchColumn() mislykkedes:SQLSTATE[HY000]:Generel fejl:2014 Kan ikke udføre forespørgsler, mens andre ubuffrede forespørgsler er aktive