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).
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
(opravdu to má na začátku podtržítko) a
.
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 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.
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("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)!
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).
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.
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.
>>> 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.
conn.close()