Pár let zpátky byla MySQL synonymem pro open-source SQL databázi, zejména v kombinaci s PHP a aplikacnim serverem Apache. Časy se mění a místo PHP tu máme Python nebo Golang, místo Apache Nginx a oblíbené cool databáze pro nové projekty jsou často z řady NoSQL, například MongoDB, CouchDB, Cassandra or ElasticSearch. V SQL světě je stále více populární PostgreSQL (který bych z open-source SQL variant preferoval i já osobně), nicméně MySQL a její odnože jsou i nadále atraktivní a často používané.

MySQL a jeho klony

Originální MySQL od Oracle není zdaleka jedinou alternativou. Je tu například Percona, která přináší pár věcí nad rámec MySQL, ale obecně se s ní drží velmi kompatibilní. A samozřejmě je tu MariaDB, která se stala [výchozím MySQL klonem ve Fedoře](https://fedoraproject.org/wiki/Features/ReplaceMySQLwithMariaDB) pár let zpět.

MariaDB zůstávala kompatibilní do verze 5.5, nicméně přeskočení k verzi 10.0 místo 5.6 byl důležitý signál, že kompatibilita již nadále není udržována v každém detailu. Například Global Transaction ID (GTID) je implementováno jinak v MySQL a jinak v MariaDB. I tak stále pro většinu reálných nasazení zůstává kompatibilita zachována a to platí jak u poslední vydané verze [10.1](https://mariadb.com/kb/en/mariadb/what-is-mariadb-101/), tak u chystané verzi [10.2](https://mariadb.com/kb/en/mariadb/what-is-mariadb-102/).

Ve Fedoře 24 můžeme nainstalovat jak MariaDB, tak MySQL, obě samozřejmě v aktuální upstream verzi — 5.7 v případě community-mysql-server balíku a 10.1 v případě mariadb-server balíku. Bohužel nelze oba balíky nainstalovat zároveň, protože soubory z obou variant mezi sebou navzájem konfliktí. Pro instalaci dvou verzí zároveň můžeme využít technologii [Software Collections](http://softwarecollections.org), ale to už je jiná pohádka.

Pro použití textového klienta nebo dalších nástrojů pro práci s databázovým serverem budeme potřebovat mariadb, resp. community-mysql balík, ty jsou ale instalovány spolu se serverem automaticky. Především pro různé drivery a konektory v různých jazycích může být potřeba klientská knihovna, která je v obou variantách k dispozici v -libs podbalíku — tyto knihovny navzájem nekonfliktní (mají rozdílný SONAME), tedy mariadb-libs a community-mysql-libs mohou být nainstalovány zároveň.

Práce se vzdáleným serverem z konzole

Dost ale už o balíčcích, pojďme se podívat, jak se databáze instalují a používají. Od této chvíle budu mluvit pouze o MariaDB, nicméně pokud nebude řečeno jinak, bude stejná věc fungovat i pro MySQL. Začneme připojením k MySQL nebo MariaDB serveru běžícím někde mimo. Samozřejmě nemusíme instalovat podbalík mariadb-server, bude nám stačit klient a to bez ohledu na konkrétní verzi serveru, neboť protkol pro komunikaci se serverem zůstává kompatibilní napříč verzemi i forky:

$ sudo dnf install mariadb

Pro připojení k serveru potřebujeme znát adresu a přístupové údaje (uživatele a heslo). Zároveň můžeme rovnou specifikovat, se kterou databází chceme pracovat (appdb v našem případě):

$ mysql -h mysqldb.example.com -u franta -p appdb

Parametr -p znamená, že chceme heslo zadat ručně, přičemž není dobrý zvyk zadávat ho přímo jako hodnotu parametru, neboť by se plain-text heslo uložilo do bash_history souboru. Komunikace se serverem je ve výchozím stavu nezašifrovaná, takže heslo i data mohou být odposlechnuta útočníkem. Pro zabezpečení komunikace lze na straně serveru i klienta nastavit SSL šifrování, ale o tom snad někdy jindy.

Práce s MySQL a MariaDB databází v Pythonu

Řekněme, že vytváříte aplikaci v Pythonu a chcete se připojit k databázi. Pokud nepotřebujete nějakou nadstavbu, jako například Django, budete k tomu potřebovat jakýkoliv MySQL modul. Zrovna v Pythonu existuje více možností, takže se pojďme podívat na rozdíly.

Balík ve Fedoře dříve dostupný pod názvem MySQL-python se nyní jmenuje [python3-mysql](https://github.com/PyMySQL/mysqlclient-python) a jedná se v podstatě jen o vrstvu mezi binární klientskou knihovnou dostupnou v systému (libmysqlclient.so), který umožňuje volání patřičných funkcí v Pythonu.

Další balík, [mysql-connector-python3](http://dev.mysql.com/doc/connector-python/en/index.html), je od Oracle a další [python3-PyMySQL](https://pypi.python.org/pypi/PyMySQL) má nezávislý upstream. Oba tyto moduly jsou nativní implementací MySQL protokolu v Pythonu, takže ke své funkci nepotřebují binární klientskou knihovnou. Benchmark dostupný na http://charlesnagy.info/it/python/python-mysqldb-vs-mysql-connector-query-performance ukazuje modul PyMySQL jako ten rychlejší.

Jelikož každá z alternativ má lehce rozdílné API, není výběr podmíněn pouze osobní preferencí, ale je potřeba také zvážit, s jakým modulem dokáže ta která aplikace pracovat. Pro praktickou ukázku jsem zvolil PyMySQL:

$ sudo dnf install python3-PyMySQL
$ python3
import pymysql
conn = pymysql.connect(host='mysqldb.example.com',
                       port=3306, user='franta',
                       passwd='secretpass', db='appdb')
cur = conn.cursor()
cur.execute("SELECT name FROM staff")
for row in cur:
    print(row)
cur.close()
conn.close()