sql >> Databáze >  >> RDS >> Mysql

Jak zkontrolovat, zda existuje záznam s Python MySQdb

Věřím, že nejúčinnějším dotazem „existuje“ je právě provést count :

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

Namísto požadavku na databázi, aby provedla jakékoli operace počítání na polích nebo řádcích, ji pouze žádáte, aby vrátila 1 nebo 0, pokud výsledek produkuje nějaké shody. To je mnohem efektivnější než vracení skutečných záznamů a počítání částky na straně klienta, protože to šetří serializaci a deserializaci na obou stranách a přenos dat.

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(*) bude stejný jako count(1) . Ve vašem případě, protože vytváříte novou tabulku, zobrazí 1 výsledek. Pokud máte 10 000 shod, bylo by to 10 000. Ale jediné, co vás ve vašem testu zajímá, je, zda NENÍ 0, takže můžete provést boolův test pravdivosti.

Aktualizovat

Ve skutečnosti je ještě rychlejší použít pouze počet řádků a dokonce ani načíst výsledky:

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

To je také způsob, jakým ORM django dělá queryObject.exists() .



  1. Použití stripslashes po mysql_real_escape_string

  2. MS-Access Class Module a VBA

  3. 4 Funkce, které extrahují mikrosekundy z časové hodnoty v MariaDB

  4. Spusťte dotazy PostgreSQL z příkazového řádku