sql >> Database >  >> RDS >> Mysql

Hoe te controleren of een record bestaat met Python MySQdb

Ik geloof dat de meest efficiënte "bestaat het"-query gewoon een count is :

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

In plaats van de database te vragen om telbewerkingen op velden of rijen uit te voeren, vraagt ​​u hem alleen om een ​​1 of 0 te retourneren als het resultaat overeenkomsten oplevert. Dit is veel efficiënter dan het retourneren van werkelijke records en het tellen van het bedrag aan de clientzijde, omdat het serialisatie en deserialisatie aan beide zijden en de gegevensoverdracht bespaart.

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(*) zal hetzelfde zijn als count(1) . In jouw geval, omdat je een nieuwe tabel aan het maken bent, zal deze 1 resultaat tonen. Als je 10.000 overeenkomsten hebt, zou het 10000 zijn. Maar het enige waar je in je test om geeft, is of het NIET 0 is, dus je kunt een bool-waarheidstest uitvoeren.

Bijwerken

Het is zelfs nog sneller om gewoon het aantal rijen te gebruiken en zelfs geen resultaten op te halen:

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

Dit is ook hoe de ORM van django een queryObject.exists() doet .



  1. enum('yes', 'no') vs tinyint -- welke te gebruiken?

  2. mysql-fout 2005 - Onbekende MySQL-serverhost 'localhost'(11001)

  3. RPAD() Functie in PostgreSQL

  4. MySQL-vraag - Unieke sleutel Werkt niet correct of begrijp ik het verkeerd?