mariadb, mysql-connector-python, pymysql

Дуже хороше питання — воно насправді важливе, якщо ти хочеш зрозуміти, який драйвер дає кращу сумісність, продуктивність і стабільність при роботі з MySQL/MariaDB. Розберімо по пунктах:


1. mysql-connector-python

Розробник: Oracle Ліцензія: GPLv2 Офіційний драйвер для MySQL

Переваги:

  • Офіційна підтримка Oracle — тобто повна сумісність з MySQL і регулярні оновлення.

  • Pure Python або C-розширення — можна вибрати версію (pure Python — кросплатформенна, C — швидша).

  • Підтримує prepared statements, transactions, connection pooling.

  • Сумісність з MySQL 8.x — включаючи нові фічі (наприклад, authentication plugins).

Недоліки:

  • ❌ Повільніший у деяких випадках, ніж PyMySQL (через офіційну, але "важку" реалізацію).

  • ❌ Може мати дрібні несумісності з MariaDB (через фічі MySQL 8, яких немає в MariaDB).


2. PyMySQL

Розробник: Спільнота (open-source) Ліцензія: MIT Реалізований повністю на Python

Переваги:

  • ✅ Простий, легкий, чисто на Python (немає потреби в компіляції C-модулів).

  • ✅ Працює і з MySQL, і з MariaDB — сумісність дуже висока.

  • ✅ Добре інтегрується з ORM-ами типу SQLAlchemy.

  • ✅ MIT-ліцензія — простіша для комерційного використання.

Недоліки:

  • ❌ Повільніший за драйвери з C-розширеннями (mysqlclient чи mysql-connector C).

  • ❌ Іноді відстає у підтримці нових фіч MySQL 8.x.


3. MariaDB — чи має свій драйвер?

Так, має! Називається mariadb (Python package: mariadb).

Розробник: MariaDB Corporation Ліцензія: LGPL Реалізація: C API + Python bindings

Переваги:

  • ✅ Офіційна підтримка MariaDB (найкраща сумісність).

  • ✅ Найвища швидкість серед трьох (бо написаний на C).

  • ✅ Підтримка всіх MariaDB-специфічних фіч (наприклад, system versioned tables, plugin auth).

  • ✅ Добре працює з MariaDB 10.x і вище.

Недоліки:

  • ❌ Потрібна C-бібліотека libmariadb у системі (не pure Python).

  • ❌ Трохи складніше встановлювати, ніж PyMySQL.

  • ❌ Може не підтримувати всі MySQL-специфічні фічі (якщо база — чистий MySQL 8).


4. Коротке порівняння

Пакет
Розробник
Мова
Швидкість
Підтримка MariaDB
Сумісність з MySQL 8
Ліцензія

mysql-connector-python

Oracle

Python/C

Середня

Часткова

Повна

GPLv2

PyMySQL

Спільнота

Pure Python

Нижча

Висока

Висока (але не всі фічі)

MIT

mariadb

MariaDB Corp.

C + Python

Висока

Ідеальна

Часткова

LGPL


Рекомендація:

  • Якщо твоя база MariaDB — краще mariadb, офіційний драйвер.

  • Якщо хочеш максимально просту установку і кросплатформеність — PyMySQL.

  • Якщо база MySQL 8 і потрібна повна підтримка його нових фіч — mysql-connector-python.


Добре. Якщо в тебе MariaDB, то найкраще рішення — офіційний драйвер mariadb (розроблений MariaDB Corporation). Розпишу по порядку: встановлення → підключення → використання → важливі нюанси.


1. Встановлення

Спочатку потрібна системна бібліотека libmariadb (вона входить до пакету клієнтських утиліт MariaDB).

Ubuntu / Debian:

sudo apt update
sudo apt install libmariadb3 libmariadb-dev python3-dev

Потім ставимо сам Python-драйвер:

pip install mariadb

2. Перевірка встановлення

python3 -m mariadb

Якщо він виведе коротку довідку — значить усе нормально.


3. Підключення до бази

import mariadb
import sys

try:
    conn = mariadb.connect(
        user="username",
        password="password",
        host="localhost",
        port=3306,
        database="testdb"
    )
    print("Підключення успішне!")
except mariadb.Error as e:
    print(f"Помилка підключення до бази: {e}")
    sys.exit(1)

cur = conn.cursor()

# Приклад запиту
cur.execute("SELECT id, name FROM users")

for (id, name) in cur:
    print(id, name)

conn.close()

4. Вставка та транзакції

cur = conn.cursor()
try:
    cur.execute(
        "INSERT INTO users (name, email) VALUES (?, ?)",
        ("Олексій", "olex@example.com")
    )
    conn.commit()  # зберігаємо зміни
except mariadb.Error as e:
    print(f"Помилка: {e}")
    conn.rollback()  # якщо треба відкотити транзакцію

Зверни увагу: замість %s, як у MySQLdb чи PyMySQL, тут використовуються знаки питання ? у prepared statements.


5. Закриття з’єднання

cur.close()
conn.close()

6. Основні особливості mariadb-драйвера

Функція
Підтримується

Prepared Statements

Connection Pooling

Transactions

SSL-з’єднання

Cursor iteration

MariaDB Authentication Plugins

MySQL 8 Authentication

⚠️ Частково

Async I/O

❌ (поки що немає офіційної async підтримки)


7. Connection Pool (опціонально)

pool = mariadb.ConnectionPool(
    pool_name="mypool",
    pool_size=5,
    user="username",
    password="password",
    host="localhost",
    database="testdb"
)

conn = pool.get_connection()
cur = conn.cursor()
cur.execute("SELECT COUNT(*) FROM users")
print(cur.fetchone())
cur.close()
conn.close()

Це корисно для вебсайтів — не відкривати нове з’єднання на кожен запит.


8. Збірка без sudo (якщо на сервері без root)

Якщо ти не можеш ставити системні бібліотеки:

pip install mariadb --user --only-binary mariadb

але це спрацює тільки якщо є готовий wheel для твоєї платформи. Інакше доведеться зібрати вручну (тоді потрібен libmariadb-dev).


9. Порада для CGI або невеликих сайтів

Оскільки у тебе сайт на чистому Python (CGI), не використовуй постійний пул, бо CGI запускає процес окремо для кожного запиту. Просто відкривай і закривай з’єднання в кожному запиті (це безпечно для низького навантаження).


Хочеш, я покажу приклад інтеграції з твоїм CGI-сценарієм (щоб прямо на сайті виконати SQL-запит)?

Last updated