# 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`](https://pypi.org/project/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:**

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

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

```bash
pip install mariadb
```

***

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

```bash
python3 -m mariadb
```

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

***

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

```python
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. Вставка та транзакції**

```python
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. Закриття з’єднання**

```python
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 (опціонально)**

```python
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)**

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

```bash
pip install mariadb --user --only-binary mariadb
```

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

***

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

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

***

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