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

Použití připravených příkazů s mysql v pythonu

Použití připravených příkazů s MySQL v Pythonu je vysvětleno např. na http://zetcode.com/db/mysqlpython/ -- na této stránce vyhledejte Prepared statements .

Ve vašem případě by to bylo např.:

sql = ('INSERT INTO {} (date, time, tag, power) VALUES '
       '(%s, %s, %s, %s)'.format(self.db_scan_table))

a později „ve smyčce“, jak jste to uvedl:

self.cursor.execute(sql, (d, t, tag, power))

bez dalšího formátování řetězců -- MySQLdb modul za vás připraví a spustí části (a může věci uložit do mezipaměti, aby se zabránilo zbytečnému opakování práce atd., atd.).

Zvažte, v závislosti na povaze "smyčky", kterou zmiňujete, že je možné, že jediné volání .execute_many (se sekvencí n-tic jako druhým argumentem) by mohla nahradit celou smyčku (pokud v této smyčce nepotřebujete více zpracování než pouhé vkládání dat do DB).

Přidáno:lepší alternativou v dnešní době může být použití vlastního Connector/Python mysql a explicitní prepare=True možnost v .cursor() továrna – viz http://dev .mysql.com/doc/connector-python/en/connector-python-api-mysqlcursorprepared.html . To vám umožní mít konkrétní kurzor na tom, které příkazy se připravují (s binárním protokolem „efektivnější než použití PREPARE a EXECUTE“, podle té stránky mysql.com) a jiný pro příkazy, které je lepší nepřipravovat; "explicitní je lepší než implicitní" je koneckonců jeden z principů v "The Zen of Python" (import this z interaktivní výzvy k přečtení všech těchto zásad). mysqldb dělat věci implicitně (a zdá se, že současná verze s otevřeným zdrojovým kódem nedělá použít připravené příkazy) nemůže být tak dobrá architektura jako Connector/Python 's jasnější.



  1. Oracle zkopíruje data do jiné tabulky

  2. Jak zálohovat databáze MySQL pomocí úloh cron

  3. MySQL:Sloupec 'název_sloupce' v místě, kde je klauzule nejednoznačná

  4. Jak funguje funkce Strftime() v SQLite