Python - MySQL

V této kapitole budu předpokládat, že jste si alespoň pročetli kapitolu o PostgreSQL. Díky tomu může být tato kapitola extrémě krátká.

Než začneme

Mysql connector pro Python není součástí standardní knihovny. Budete si muset doinstalovat nějaký balíček, například python-mysql nebo python-MySQL-python. Uživatelé Windows se mohou podívat na mysql-python. (Nezkoušel jsem, za nic neručím.)
Bohužel se mi podařilo najít jen verze pro Python 2.7 a ne 3.0!

Update

Knihonva PyMySQL se dá snadno nainstalovat pro Python 2.7 i 3.x. Doporučuji tedy použít ji a budu dále popisovat její použití. Tato knihovna má stejné rozhraní jako starší knihovna python-MySQL-python, pro kterou jsem tuto kapitolu psal původně. Takže vlastně popisuji obě knihovny :-).

Instalace PyMySQL je jednoduchá. Stáhněte si balíček, PyMySQL-0.6.6.tar.gz (nebo novější), rozbalte jej, přejděte do adresáře PyMySQL-0.6.6 a spusťte (jako superuživatel) python setup.py install (nainstaluje se do pythonu 2.7) a python3 setup.py install (nainstaluje se do pythonu 3.x).

gunzip PyMySQL-0.6.6.tar.gz
tar xvf PyMySQL-0.6.6.tar
cd PyMySQL-0.6.6
sudo python setup.py install  #instalace pro python 2.7
sudo python3 setup.py install #instalace pro python 3.x

Instalace ve Windows je v podstatě stejná. Rozbalit a spustit python setup.py install.

Další možnosti připojení k MySQL můžete najít např. na Stack Overflow.

Než začnete pracovat s databází v Pythonu je třeba se ujistit, že existuje databáze, ke které máte příslušná práva. Databáze, na které budu ukazovat příkazy, se jmenuje group10. Pokud tedy zadám na příkazovou řádku shellu příkaz mysql group10 -u petr -h localhost, navážu spojení s databází (bez zadávání hesla) a můžu vytvářet tabulky.

Spojení s databází

Balíček python-mysql obsahuje moduly jménem _mysql (opravdu to má na začátku podtržítko) a MySQLdb. Druhý znich je objektová obálka nad tím prvním a je to preferovaný způsob připojení k MySQL. Balíček PyMySQL obsahuje modul pymysql.

Jediný rozdíl v používání těchto balíčků bude použití příkazu import. Použijte ten, podle toho, který balíček máte nainstalovaný.

import MySQLdb as mysql   # pytnon-mysql
import pymysql as mysql   # PyMySQL

Metoda connect() dostává jako argumenty adresu serveru (localhost), jméno uživatele, heslo a jméno databáze. Můžete také zadat port a mnoho dalších voleb (viz help(_mysql.connect)).

Druhým krokem je vytvoření kurzoru, který se bude používat pro zadávání SQL dotazů do databáze přes connection.

import pymysql as mysql   # PyMySQL
conn = mysql.connect(host='localhost',user='petr',passwd='',db='group10')
curs = conn.cursor()

Zadávání příkazů

SQL dotazy předáváte metodě execute() objektu cursor.

curs.execute("CREATE TABLE tab1 (jmeno varchar(20), telefon varchar(20))")
curs.execute("INSERT INTO tab1 VALUES (%(jmeno)s,%(fon)s)",
    {'jmeno':'Karel Gott','fon':'298765'})

Ukončení transakce

Aby se změny v databázi uložili, musíte zavolat metodu commit() objektu connection. Transakce se také ukončuje DML SQL příkazy (například vytvořením tabulky)!

conn.commit();

Pokud chcete transakci zrušit, použijte metodu rollback() (conn.rollback()). Tato metoda zruší všechny změny provedené od začátku transakce (posledního použití metody commit() nebo DML příkazu).

Tabulky typu InnoDB nepodporují transakce, tj. metody commit() a rollback() nemají na provádění změn vliv (provádí se okamžitě).

Pokud chcete, aby se každý insert ihned zapsal do DB a nemuseli jste zadávat conn.commit(), nastavte autocommit objektu connection na True.

conn.autocommit(True)

Práce s tabulkami

Práce s tabulkami je stejná, jako v PostgreSQL. Používají se metody fetchall() nebo fetchone() objektu kurzor

Práce s datovými typy

Pokud budete ve svých SQL tabulkách pracovat s typem date, bude se v Pythonu automaticky převádět na objekt datetime.date. Obdobně je to i s dalšími datovými typy, které má Python jak převést.

>>> import pymysql as mysql   # PyMySQL
>>> conn = mysql.connect(host='localhost',user='petr',passwd='',db='group10')
>>> curs = conn.cursor()
>>> curs.execute("CREATE TABLE tab2 (jmeno varchar(20), datum date)")
<sqlite3.Cursor object at 0xb732f7a0>
>>> curs.execute("INSERT INTO tab2 VALUES ('Muromec','2002-02-21')")
<sqlite3.Cursor object at 0xb732f7a0>
>>> curs.execute("SELECT * from tab2")
<sqlite3.Cursor object at 0xb732f7a0>
>>> radek = curs.fetchone()
>>> print(radek[0], radek[1])
('Muromec', datetime.date(2002, 2, 21))

Ukončení práce s databází

Spojení k databázi byste měli vždy uzavřít. Nepoužívaný cursor také, ať neplýtváte prostředky.

curs.close()
conn.close()
Komentář Hlášení chyby
Created: 11.9.2005
Last updated: 2.9.2015
Tato stánka používá ke svému běhu cookies, díky kterým je možné monitorovat, co tu provádíte (ne že bych to bez cookies nezvládl). Také vás tu bude špehovat google analytics. Jestli si myslíte, že je to problém, vypněte si cookies ve vašem prohlížeči, nebo odejděte a už se nevracejte :-). Prohlížením tohoto webu souhlasíte s používáním cookies. Dozvědět se více..